2015-03-01 2 views
1

У меня проблемы с красноречивым запросом.

Пользователи имеют много фидов и фидов, которые имеют много предметов.

Мне нужно получить все элементы, относящиеся к фидам пользовательского порядка по дате.

У меня сводная таблица:

feed_user 
---------- 

- id 
- feed_id 
- user_id 

и отношения определяются как это в моих моделях:

class UsersController extends BaseController { 


public function feeds() { 
    return $this->hasMany('feed'); 
} 


class Feed extends \Eloquent { 

protected $fillable = []; 

public function users() { 
    return $this->belongsToMany('User'); 
} 

public function items() { 
    return $this->hasMany('Item'); 
} 

class Item extends \Eloquent { 
protected $fillable = []; 

public function feed() { 
    return $this->belongsTo('Feed'); 
} 

Но когда я делаю этот запрос ...

Auth::user()->feeds->items->orderBy('date', 'DESC')->get(); 

Он возвращает эту ошибку:

Cannot access protected property Illuminate\Database\Eloquent\Collection::$items 

ответ

2

Есть несколько вопросов здесь.

Во-первых, отношение к модели пользователя неверно. Отношение hasMany равно половине отношений «один ко многим». Это предполагает, что фид принадлежит одному пользователю и что таблица фида имеет поле user_id. Соотношение «многие ко многим» определяется добавлением отношения belongsToMany для обеих моделей. Таким образом, пользователю принадлежит много фидов, а фид принадлежит многим пользователям.

class User extends \Eloquent { 
    public function feeds() { 
     return $this->belongsToMany('feed'); 
    } 
} 

Следующая ошибка, вы видите, потому что Auth::user()->feeds возвращает Illuminate\Database\Eloquent\Collection объект. Затем вы пытаетесь получить доступ к атрибуту items в коллекции, который защищен и выдает ошибку, которую вы видите.

Наконец, поскольку Laravel не использует объединения для отношений, вы не можете заказать запрос по полю в связанной таблице, не вручную сделав соединение самостоятельно.

+0

Большое спасибо! Мне удалось вернуть объект со всеми элементами фида: $ feeds = Auth :: user() -> feeds; \t \t $ contents = new ArrayObject; \t \t Еогеаспа ($ каналов в $ корма) { \t \t \t $ пунктов = Пункт :: где ('FEED_ID', $ запитка> идентификатора) -> с ('' поток) -> OrderBy ('датой', 'DESC') -> получить(); \t \t \t Еогеасп ($ детали как $ п) { \t \t \t \t $ содержание [] = $ элемент; \t \t \t} \t \t} Но я не знаю, как сортировать результаты по дате. Может, мне нужно задать другой вопрос? – vali2009

+0

@ vali2009 Есть несколько простых способов сделать то, что вы пытаетесь сделать здесь.Думаю, вам лучше задать новый вопрос. Однако одна конкретная заметка: нет необходимости запрашивать такой элемент. Внутри вашего foreach '$ feed' является моделью Feed, поэтому вы можете получить доступ к своим элементам через' $ feed-> items'. – patricus

+0

Ну, еще раз большое спасибо за вашу помощь, Laravel и ориентированное кодирование объектов для меня нова, поэтому я не думаю об этом «ярлыках». Я задам новый вопрос, потому что я уже пытался отсортировать объект моего большого предмета без успеха. Это немного сложно. – vali2009

0

Попробуйте использовать жадную загрузку:

Auth::user()->with('feeds.items')->orderBy('date', 'DESC')->get(); 
+0

Спасибо @bogdan, но он возвращает новую ошибку: вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: items() – vali2009

+0

Теперь он сгенерирует этот SQL: выберите * из 'users' порядка' date' desc. Мне нужно сортировать элементы по дате, а не пользователям, как я могу это сделать? Спасибо за вашу помощь. – vali2009

Смежные вопросы