Использование Laravel 3 Eloquent ORM

У меня есть следующий код, который работает, но, похоже, не следует красноречивому способу laravel:

Article::left_join('images', 'articles.id', '=', 'images.article_id')
            ->join('article_category', 'articles.id', '=', 'article_category.article_id')
            ->where('article_category.category_id', '=', $category_id)
            ->get();

У меня есть 4 таблицы; статьи и категории, которые имеют отношения «многие ко многим» друг с другом, сводная таблица, таблица article_category, которая содержит идентификатор статьи и идентификатор категории, и таблица изображений, которая имеет отношение один к одному со статьей.

Я настраиваю свои модели как:

class Category extends Eloquent {
    public static function get_articles($category_id) {
        return static::find($category_id)->has_many_and_belongs_to('Article');
    }

class Article extends Eloquent {
    public function categories() {
        return $this->has_many_and_belongs_to('Category');
    }

    public function image() {
        return $this->has_one('Image');
    }

Однако я не могу собрать все три бита информации вместе. Я могу сделать:

Category::get_articles($current_category)->get();

Чтобы получить все статьи в данной категории, но я не могу получить изображение для статьи, похоже, мне не к чему прицепиться? Если я делаю это неправильно? Есть ли трюк, который мне не хватает?

Я даже попробовал урезанную версию из документации:

foreach (Article::with('image')->get() as $article) {
    echo $article->image->foo;
}

Однако я получаю сообщение об ошибке: Попытка получить свойство не-объекта, хотя var_dump показывает, что $ article-> image является объектом! Странный.

Спасибо


person user1781543    schedule 06.02.2013    source источник


Ответы (1)


Если вы не настроили модель для таблицы изображений, сделайте это. ORM нуждается в модели, чтобы он знал, на что ссылается «Изображение».

Можно ли получить информацию о категории с помощью метода ::with или это тоже проблематично?

person Robbkore    schedule 06.02.2013