Laravel 5.6与whereHas的多态关系

时间:2018-05-08 12:52:54

标签: php foreign-keys relational-database laravel-5.6 laravel-query-builder

我面临着多态关系中的一个问题,我无法在哪里工作。基本上我有一个“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'where子句'中的未知列'cat_id'(SQL:选择count(*)作为orders中存在的聚合(select {from orders作为laravel_reserved_0 laravel_reserved_0id = laravel_reserved_0part_stock_numbercat_id = 2和laravel_reserved_0id = laravel_reserved_0part_stock_numbercat_id = 2))

数据库表结构

enter image description here

我试图得到的数据是每个部分相关的订单列表。然后我得到与此部分相关的类别名称。此外,我想通过使用whereHas过滤此列表,例如我获得特定类别的所有订单。

订单表包含与零件链接的订单。这部分可以在3个表中的任何一个,这就是为什么我在两个键上使用多态关系中继department_short_code和part_stock_number

2 个答案:

答案 0 :(得分:7)

有些问题使用whereHas我不知道为什么。这种情况可以通过其他方式处理

  

您可能找不到编辑器中的哪个方法但可以使用它并且它可以相应地工作。使用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();

答案 1 :(得分:0)

您可以安全干净地使用以下代码。您虽然不熟练,但仍使用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();