2013-09-11 3 views
3

При использовании жадной загрузки в Laravel 4 мы можем нагрузить отношения, используя следующие:Фильтрация полей по возвращенным отношениям в Laravel4?

$user = User::with('role')->find(1); 

Который возвращает представление пользователя, и мы можем получить доступ представление о роли через

$user->roles(); 

сейчас мы также можем отфильтровать нетерпеливую нагрузку, используя:

$user = User::with(array('role' => function($query) { 
    $query->where('name', 'like', '%key%'); 
}))->find(1); 

Которая вернет представление пользователя с ролями заполняется только там, где поле имени роли содержит key.

Мы можем ограничить поля, возвращенные в представлении пользователя, добавив ограничение select().

$user = User::with(array('role' => function($query) { 
    $query->where('name', 'like', '%key%'); 
}))->select('email')->find(1); 

Который будет возвращать только email и id поля на представлении пользователя, но все поля на представлении роли.

Я надеялся, что смогу ограничить поля, возвращенные на отношения (для использования в api), но я не могу найти способ; Я попробовал два метода ниже.

$user = User::with(array('role' => function($query) { 
    $query->select('name'); 
}))->find(1); 

и

$user = User::with('role')->select('role.name')->find(1); 

ответ

1

Вы можете указать, какие столбцы вы хотите в определении отношения.

// app/model/User.php 
<?php 

class User extends Eloquent 
{ 
    public function roles() 
    { 
     return $this->hasMany('Role')->select(array('id', 'name')); 
    } 
} 

Первые пары в array('id', 'name') массиве, является столбцом внешнего ключа на таблице ролей, которая соединяет его с таблицей пользователей.

Редактировать (в соответствии с вашим комментарием)

Я попробовал несколько вещей, и вы на правильном пути в первом примере. Небольшое изменение:

$user = User::with(array('role' => function($query) { 
    $query->select(array('id', 'name')); 
}))->find(1); 

Это должно сработать.

+0

Проблема в том, что я не знаю, какие столбцы я после того, как пока пользователь апи не запросит что-то вроде 'поля = электронная почта, роль: (имя)' в строке запроса. – Hailwood

+0

@ Hailwood Я обновил свой ответ. –

+0

Нет, не работает, он имеет эффект в том, что именованные поля перечислены первыми в представлении ролей, но это не ограничивает ответ только этими полями! – Hailwood

1

Хотя он не фильтрует, какие столбцы возвращаются, поскольку это не является жизнеспособным решением, если вы хотите предотвратить захват довольно большого столбца (например, содержимое сообщения в блоге), это можно использовать для фильтрации того, какие столбцы видны, когда представленный как массив или Json.

//fetch the unfiltered relationship 
$user = User::with('roles')->find($id); 

//loop over each model in that relationship and set the visible properties 
$user->roles->each(function($role){ 
    $role->setVisible(['id', 'name', 'pivot']); 
}); 
Смежные вопросы