2017-02-15 13 views
1

У меня есть две модели: Order и Department, соединенные отношениями «многие ко многим». В сводной таблице этого отношения содержится поле «статус». Поэтому конкретный заказ может выглядеть примерно так:Laravel 5.4: Продвинутый вопрос запроса сводной таблицы

  • Производство: завершено
  • Упаковка: (не требуется/не прилагается)
  • Доставка: Идет

В интерфейсе для моего приложения I иметь вкладку для каждого отдела и флажки для статусов. Таким образом, API должен иметь возможность принимать запрос с одним отделом и несколькими возможными статусами и возвращать все заказы, которые соответствуют одному из выбранных статусов для данного отдела.

Пример запроса: /api/orders?dep=manufacturing&statuses=notStarted,inProgress

Это необходимо, чтобы вернуть все заказы, которые либо «не началась» или «в процессе» для производственного отдела (независимо от статуса в любом другом отделе)

Вот запрос, я написал:

$query = Order::with("departments"); 
$department = Request::get('department'); 
$statuses = explode(",", Request::get('statuses', "")); 

if (!empty($department)) 
{ 
    $query->whereHas('departments', function ($q) use ($department) 
    { 
     $q->where('name', $department); 
    }); 
    if (count($statuses) > 0) 
    { 
     $query->where(function ($q) use ($department, $statuses) 
     { 
      foreach ($statuses as $status) 
      { 
       $q->orWhereHas('departments', function ($q) use ($department, $status) 
       { 
        $q->where('name', $department)->wherePivot('status', $status); 
       } 
      } 
     }); 
    } 
} 

return $query->paginate(15); 

Это бросает ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pivot' in 'where clause' 

Мои отношения определяется следующим образом:

public function departments() 
{ 
    return $this->belongsToMany('App\Models\Department', 'order_statuses')->using('App\Models\OrderStatus')->withPivot('status')->withTimestamps(); 
} 

ответ

0

я в конечном итоге пришли к следующему решению этого:

if (!empty($departments) 
{ 
    if (count($statuses) > 0) 
    { 
     $query->whereHas('departments', function ($q) use ($department, $statuses) 
     { 
      $q->where('name', $department)->whereIn('order_statuses.status', $statuses); 
     } 
    } else { 
     $query->whereHas('departments', function ($q) use ($department) 
     { 
      $q->where('name', $department); 
     } 
    } 
} 
0

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

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2'); 
+0

Мои отношения определяли с помощью 'withPivot'. Я обновляю свой оригинальный пост с определением всех отношений – stevendesu

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

  • Нет связанных вопросов^_^