У меня есть 2 связанных таблицы в Eloquent, а именно темы и пользователи.
Тематическая модель:
public function user() { return $this->belongs_to('User'); }
модель пользователя:
public function themes() { return $this->has_many('Theme'); }
Вызов My Eloquent api выглядит следующим образом:
return Response::eloquent(Theme::with('user')->get());
Который возвращает все столбцы из темы (это нормально) и все столбцы от пользователя (не очень хорошо). Мне нужен только столбец «имя пользователя» из пользовательской модели, как я могу ограничить этот запрос?
Измените свою модель, чтобы указать, какие столбцы вы хотите выбрать:
public function user() { return $this->belongs_to('User')->select(array('id', 'username')); }
И не забудьте включить колонку, к которой вы присоединяетесь.
Используйте метод -> pluck ()
$roles = DB::table('roles')->pluck('title');
Если вы хотите получить массив, содержащий значения одного столбца, вы можете использовать метод pluck
Используйте метод -> lists ()
$roles = DB::table('roles')->lists('title');
Этот метод вернет массив названий ролей. Вы также можете указать собственный столбец ключей для возвращаемого массива:
Вы можете указать массив полей в параметре get так:
return Response::eloquent(Theme::with('user')->get(array('user.username'));
ОБНОВЛЕНИЕ (для Laravel 5.2) Из документов вы можете сделать это:
$response = DB::table('themes') ->select('themes.*', 'users.username') ->join('users', 'users.id', '=', 'themes.user_id') ->get();
Я знаю, вы спрашиваете Eloquent, но можете сделать это с помощью Fluent Query Builder
$data = DB::table('themes') ->join('users', 'users.id', '=', 'themes.user_id') ->get(array('themes.*', 'users.username'));
Другой вариант – использовать свойство $hidden
для модели, чтобы скрыть столбцы, которые вы не хотите отображать. Вы можете определить это свойство на лету или установить значения по умолчанию для своей модели.
public static $hidden = array('password');
Теперь пароль пользователя будет скрыт при возврате ответа JSON.
Вы также можете установить его на лету аналогичным образом.
User::$hidden = array('password');
Вот как я это делаю
$posts = Post::with(['category' => function($query){ $query->select('id', 'name'); }])->get();
Первый ответ от пользователя2317976 не помог мне, я использую laravel 5.1
Использование с разбиением на страницы
$data = DB::table('themes') ->join('users', 'users.id', '=', 'themes.user_id') ->select('themes.*', 'users.username') ->paginate(6);
user2317976 ввел отличный статический способ выбора столбцов соответствующих таблиц.
Вот динамический трюк, который я нашел, чтобы вы могли получать все, что захотите, при использовании модели:
return Response::eloquent(Theme::with(array('user' => function ($q) { $q->addSelect(array('id','username')) }))->get();
Я просто нашел, что этот трюк также хорошо работает с load (). Это очень удобно.
$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});
Убедитесь, что вы также включили ключ целевой таблицы, иначе он не сможет его найти.
Сюда:
Post::with(array('user'=>function($query){ $query->select('id','username'); }))->get();
Я знаю, что это старый вопрос, но если вы создаете API, как автор вопроса, используйте выходные трансформаторы для выполнения таких задач.
Transofrmer – это слой между вашим фактическим результатом запроса базы данных и контроллером. Это позволяет легко контролировать и изменять то, что будет выводиться пользователю или потребителю API.
Я рекомендую Fractal как прочную основу вашего выходного трансформационного слоя. Здесь вы можете прочитать документацию.
В Laravel 4 вы можете скрыть определенные поля от возврата, добавив следующее в свою модель.
protected $hidden = array('password','secret_field');
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
Использование модели:
Model::where('column','value')->get(['column1','column2','column3',...]);
Использование Query Builder:
DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);
Если я хорошо понял, что то, что возвращается, прекрасно, если вы хотите увидеть только один столбец. Если так, то это ниже должно быть намного проще:
return Response::eloquent(Theme::with('user')->get(['username']));
Отъезд, http://laravel.com/docs/database/eloquent#to-array
Вы должны быть в состоянии определить, какие столбцы вы не хотите отображать в своем api.