Intereting Posts
Php не обновится, чтобы показать новый контент sql Перезапись Url с .htaccess для множественных параметров Вставьте несколько строк с тем же уникальным идентификатором Как напечатать значение, выбранное в раскрывающемся списке на PHP, или установить его как выбранное? PHP: Загрузите входящую электронную почту из POP3 или IMAP, проанализируйте ее и пометьте как чтение / удаление на сервере Библиотека CSS-селектора CSS? Пользовательские короткие коды WooCommerce Ошибка Memcache: Ошибка строки чтения из потока (0) Массив Laravel 5 не работает на общем хостинге Понимание вложенного PHP-тернарного оператора Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым ресурсом результата MySQL Магические методы __get и __set – пример из ZCE Как обновить базу данных mysql без перезагрузки страницы как преобразовать значения массива из строки в int? Каков наилучший способ хранения динамических настроек в php?

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

У меня есть 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')); } 

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

Для Laravel> = 5.2

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

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

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


Для Laravel <= 5.1

Используйте метод -> 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.