Laravel Eloquent: как получить только определенные столбцы из объединенных таблиц

У меня есть две объединенные таблицы в Eloquent, а именно темы и пользователи.

модель темы:

public function user() {
  return $this->belongs_to('User');
}

модель пользователя:

public function themes() {
  return $this->has_many('Theme');
}

My Eloquent api call выглядит следующим образом:

return Response::eloquent(Theme::with('user')->get());

Возвращает все столбцы из темы (это прекрасно) и все столбцы от пользователя (не совсем). Мне нужен только столбец "имя пользователя" из пользовательской модели, как я могу ограничить этот запрос?

Ответ 1

Измените свою модель, чтобы указать, какие столбцы вы хотите выбрать:

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

И не забудьте включить столбец, в который вы входите.

Ответ 2

Для Laravel >= 5.2

Используйте метод - > pluck()

$roles = DB::table('roles')->pluck('title');

Если вы хотите получить массив, содержащий значения одного столбца, вы можете использовать метод pluck


Для Laravel <= 5.1

Используйте метод - > lists()

$roles = DB::table('roles')->lists('title');

Этот метод вернет массив названий ролей. Вы также можете указать собственный столбец ключей для возвращаемого массива:

Ответ 3

Вы можете указать массив полей в параметре get так:

return Response::eloquent(Theme::with('user')->get(array('user.username'));

UPDATE (для Laravel 5.2) Из docs вы можете сделать это:

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();

Ответ 4

Я знаю, вы просите Eloquent, но вы можете сделать это с помощью Fluent Query Builder

$data = DB::table('themes')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get(array('themes.*', 'users.username'));

Ответ 5

Другой вариант - использовать свойство $hidden в модели, чтобы скрыть столбцы, которые вы не хотите отображать. Вы можете определить это свойство на лету или установить значения по умолчанию для своей модели.

public static $hidden = array('password');

Теперь пароль пользователя будет скрыт при возврате ответа JSON.

Вы также можете установить его на лету аналогичным образом.

User::$hidden = array('password');

Ответ 6

Вот как я это делаю

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

Первый ответ пользователя2317976 не сработал у меня, я использую laravel 5.1

Ответ 7

Использование с разбивкой на страницы

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

Ответ 8

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(..)});

Убедитесь, что вы также включаете ключ целевой таблицы, иначе он не сможет его найти.

Ответ 9

Этот способ:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

Ответ 10

Я знаю, что это старый вопрос, но если вы создаете API, как автор вопроса, используйте выходные трансформаторы для выполнения таких задач.

Transofrmer - это слой между фактическим результатом запроса базы данных и контроллером. Это позволяет легко контролировать и изменять то, что будет выводиться пользователю или потребителю API.

Я рекомендую Fractal как прочную основу вашего уровня преобразования вывода. Вы можете прочитать документацию здесь.

Ответ 12

Использование модели:

Model::where('column','value')->get(['column1','column2','column3',...]);

Использование Query Builder:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);

Ответ 13

Если я хорошо понял, то, что возвращается, прекрасно, если вы хотите увидеть только один столбец. Если так, то это ниже должно быть намного проще:

return Response::eloquent(Theme::with('user')->get(['username']));