web-dev-qa-db-ja.com

Laravel 5.6whereHasとのポリモーフィックな関係

私は多形関係の問題に直面していて、どこで仕事をすることができないのか。基本的に、適用したい「where」条件があります。リレーションコードは関連モデルを返すために正常に機能していますが、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' in'where句 '(SQL:select count(*)as Aggregate from orders where presents(select * from orders as 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つのキーでポリモーフィックリレーションリレーを使用しました。

10
Hadi.M

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();
8
Jai Joshi