Какой тип отношений выбрать в Laravel Eloquent ORM для случая нескольких отношений
Я новичок в Laravel и немного озадачен некоторыми определениями ORM. В настоящее время я работаю над простой системой управления тикетами, и вот мой вопрос: (таблица: столбец, столбец,...) тикеты: id, description, equipment_id оборудование: id, name, vendor_id vendor: id, name
Это очень краткое резюме моих таблиц и их отношений, следуя соглашениям Ларавела. Как я могу построить эти модели?
В основном мне нужно узнать, например, сколько билетов было открыто определенному поставщику (сколько раз я звонил поставщику за поддержкой).
заранее спасибо
2 ответа
То, что сказал zwacky, полностью (правка: может быть, не совсем правильно в конце) верно для близких отношений, но в вашей ситуации есть вложенное отношение:
Vendor -> Equipment -> Ticket
Затем, чтобы получить билеты для конкретного поставщика, вы должны определить отношение на модели поставщика следующим образом:
class Vendor extends Eloquent {
public function equipment()
{
return $this->hasMany('Equipment');
}
public function tickets()
{
return $this->hasManyThrough('Ticket', 'Equipment');
}
class Equipment extends Eloquent {
public function tickets()
{
return $this->hasMany('Ticket');
}
public function vendor()
{
return $this->belongsTo('Vendor');
}
class Ticket extends Eloquent {
public function equipment()
{
return $this->belongsTo('Equipment');
}
и получить общее количество билетов для продавца (в настоящее время не открыто):
Vendor::find($id) // retrieve particular vendor
->tickets()->count(); // get count on tickets table
// and this way you retrieve collection of related tickets
Vendor::find($id) // retrieve particular vendor
->tickets; // get Eloquent Collection
Также вы можете найти это полезным: http://softonsofa.com/querying-relations-with-eloquent-in-laravel-4/
Вам нужно будет объявить эти отношения в своих моделях. например, ваш Ticket.php
Модель может выглядеть так:
class Ticket extends Eloquent {
public function equipment()
{
return $this->hasOne('Equipment');
}
public function vendor()
{
return $this->hasOne('Vendor');
}
...
}
для поиска вы бы сделали это так:
foreach (Ticket::all() as $ticket) {
$ticket->vendor()->id;
}
проверьте этот раздел документации по Laravel.
изменить: для конкретного запроса, сколько билетов открыто для определенного поставщика:
Ticket::where('open', '=', 1)->vendor()->where('id', '=', 42);