Laravel 5.6 Полиморфная связь с whereHas - PullRequest
0 голосов
/ 08 мая 2018

Я сталкиваюсь с проблемами в полиморфном отношении, где я не могу сделать, где надо работать. В основном у меня есть условие «где», которое я хочу применить. Код отношения работает нормально, чтобы вернуть связанные модели, но он возвращает ошибки после применения whereHas.

Ниже приведен код

Класс заказов:

class Order extends Model
 {

  // function to return orders 
  public static function getAllOrders()
  { 


    return $orders = Order::with('part.pcategory')->whereHas('part', function ($query) 
         {
                  $query->where('cat_id',4);
         })->get();
  }

  // the relation 
  public function part()
  { 

  return $this->morphTo(null,'department_short_code','part_stock_number','stock_number', 'dep_short_code');
  }

 }

Класс запасных частей SFD:

class sfd_part extends Model
{

  public function orders()
    {   

    return  $this->morphMany('App\Order','part','department_short_code','part_stock_number');
   }

   public function pcategory()
    {

    return $this->belongsTo('App\Pcategories','cat_id', 'category_id');
    }

}

Когда я вызываю getAllOrders (), это выдает ошибку ниже

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'cat_id' в 'предложении где' (SQL: выбрать количество (*) в качестве совокупности из orders, где существует (выберите * из orders как laravel_reserved_0) где laravel_reserved_0. id = laravel_reserved_0. part_stock_number и cat_id = 2 и laravel_reserved_0. id = laravel_reserved_0. part_stock_number и cat_id = 2))

Структура таблиц базы данных

enter image description here

Данные, которые я пытаюсь получить, представляют собой список заказов, связанных с каждой частью. Затем я получаю название категории, которая связана с этой частью. Также я хочу отфильтровать этот список, используя whereHas, где я получаю, например, все заказы, которые пришли для определенной категории.

Таблица заказов содержит заказы, связанные с деталью. эта часть может быть в любой из 3 таблиц, поэтому я использовал Полиморфное отношение, передавая два ключа Department_short_code и part_stock_number

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Вы можете безопасно и чисто использовать приведенный ниже код.Вы вышли из Eloquent, но все еще используете функции laravel.

Order::with('part.pcategory')
    ->leftJoin('sfd_parts','orders.part_id','=','sfd_parts.id')
    ->where('orders.part_type','=',sfd_parts::class)
    ->where('sfd_parts.cat_id','=',4)
    ->get();
0 голосов
/ 16 мая 2018

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

вы можете не найти метод where в редакторах, но его можно использовать, и он работает соответствующим образом. используйте tosql () для дальнейшей проверки запроса.

Order::with('part.pcategory')->where( function ($query) {
        $query->whereIn('part_id', function ($query) {
            $query->select('id')
                ->from('sfd_part')
                ->where('cat_id',4);
        });
    })->get();
...