Какой тип отношений выбрать в 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);
Другие вопросы по тегам