2013-06-08 3 views
1

Я настраиваю несколько моделей, которые хотят знать правильный подход к структуре таблицы и отношениям модели.Laravel 4 Eloquent/Model Relationships

Предположим, у нас есть магазин, содержащий продукты, каждый со свойствами и цветом.

Таблица products

  • ID
  • size_id
  • color_id
  • цена

Таблица sizes

  • идентификатор
  • имя

Таблица colors

  • идентификатор
  • имя

Модели

class Product extends Eloquent { 
    public function size() { 
     return $this->hasOne('Size', 'id'); 
    } 
    public function color() { 
     return $this->hasOne('Color', 'id'); 
    } 
} 
class Size extends Eloquent { 
    public function products() { 
     return $this->belongsTo('Product', 'size_id'); 
    } 
} 
class Color extends Eloquent { 
    public function products() { 
     return $this->belongsTo('Product', 'color_id'); 
    } 
} 

Таким образом, я легко могу повторить цвет/размер продукта с использованием {{ Product->size['name'] }}. Кроме того, я хочу передать Eloquent внешний ключ размера size.id, например Product::where('size_id', '5'), а не его имя size.name.

Задача: Выполнение $products = Product::has('size', '=', '5')->get() не дает мне никаких результатов, но делает $products = Product::where('size_id', '5')->get() делает.

Я довольно смущен, что пошло не так?

+0

Есть ли у Вас внешняя установка ограничений, правильно? –

+0

@RobW Я только что редактировал сообщение, вы имеете в виду '$ this-> attribTo ('Size', 'size_id');'? – Nyxynyx

+0

И, вы не имеете в виду '$ products = Product :: has ('size', '> =', 5) -> paginate (15)' –

ответ

4

Я думаю, что проблема в том, что ваш метод ::has() ищет продукты с ровно 5 различными размерами на каждом конкретном продукте, что предполагает, что вы используете $this->hasMany('Size') в своей модели продукта. В тех случаях, когда метод ::where() возвращает результаты, где размер продукта равен 5.

В документации используется пример комментариев. У сообщения будет список комментариев. Вы можете найти сообщения, содержащие хотя бы один комментарий (то есть Post::has('comments')->get()), или вы можете найти сообщения, содержащие более 3 комментариев (то есть Post::has('comments', '>=', '3')->get()).

http://laravel.com/docs/eloquent#querying-relations