2014-02-08 3 views
4

Таким образом, у меня есть множество отношений между пользователями и фотографиями через сводную таблицу user_photo. Я использую belongsToMany('Photo') в моей модели пользователя. Однако проблема в том, что у меня есть десяток столбцов в моей таблице фотографий, которые мне больше не нужны (особенно во время ответа json). Так примером может быть:Laravel принадлежитTMMany, чтобы возвращать только определенные столбцы

//Grab user #987's photos: 
User::with('photos')->find(987); 
//json output: 
{ 
    id: 987, 
    name: "John Appleseed", 
    photos: { 
    id: 5435433, 
    date: ..., 
    name: 'feelsgoodman.jpg', 
    ....// other columns that I don't need 
    } 
} 

Можно ли изменить этот метод такой, что Photos модель только будет возвращать принятые столбцы (скажем, задается массив ['name', 'date'])?

User.php

public function photos() 
{ 
    return $this->belongsToMany('Photo'); 
} 

Примечание: Я только хочу, чтобы выбрать конкретные столбцы при выполнении User->belongsToMany->Photo только. Когда вы делаете что-то вроде Photo::all(), да, я бы хотел, чтобы все столбцы были нормальными.

EDIT: Я пробовал Get specific columns using "with()" function in Laravel Eloquent, но столбцы по-прежнему выбираются. Также https://github.com/laravel/laravel/issues/2306

ответ

0

Предполагается, что у вас есть столбец с именем user_id. Тогда вы должны быть в состоянии сделать следующее:

public function photos() 
{ 
    return $this->belongsToMany('Photo')->select(['id', 'user_id', 'date', 'name']); 
} 

Вы должны выбрать, внешний ключ, иначе он не будет иметь никакого способа присоединения к нему.

+0

Я попытался это, но он все равно будет выбрать другие столбцы ... – tiffanyhwang

+0

Fixed 'belongsToMany ('Photo')'. В таблице 'photo_user' есть поля' photo_id' и 'user_id'. – tiffanyhwang

+0

Попробуйте использовать метод get вместо select. Вызывает ли это исключение? – jah

1

Задание точных столбцов, необходимых для отношений Photos, скорее всего, приведет вас в укус в будущем, если потребности вашего приложения будут когда-либо изменяться. Лучшим решением было бы указать только данные, которые вы хотите вернуть в , конкретный экземпляр, то есть конкретный ответ JSON, который вы отправляете.

Вариант 1: продлить/перезаписать toArray() Элегантная функция (которая вызывается toJson()) и изменяет возвращаемую им информацию. Это повлияет на каждый вызов этим методам, тем не менее, так что это может привести к тем же проблемам, что и select() в исходном запросе.

Вариант 2. Создайте конкретный метод для ответа JSON и назовите его вместо общего toJson(). Затем этот метод мог бы выполнять любые модификации построения данных/массивов, необходимые для достижения требуемого результата.

Вариант 3: Если вы работаете с вызовами API или ajax в целом, которые нуждаются в определенном формате, подумайте об использовании библиотеки, такой как League/Fractal, которая построена именно для такого случая. (Фил также работает на book on building APIs, и он не сосать.)

0

Вы можете использовать ownToMany с помощью операции select с использованием отношений laravel.

public function photos() 
{ 
    return $this->belongsToMany('Photo')->select(array('name', 'date')); 
} 
Смежные вопросы