Laravel 5.6与whereHas的多态关系

问题描述 投票:9回答:2

我正面临多形关系中的问题,我无法在哪里工作。基本上我有一个“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中存在的聚合(选择*来自orders作为laravel_reserved_0,其中laravel_reserved_0.id = laravel_reserved_0.part_stock_numbercat_id = 2和laravel_reserved_0.id = laravel_reserved_0.part_stock_numbercat_id = 2))

数据库表结构

enter image description here

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

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

php foreign-keys relational-database laravel-5.6 laravel-query-builder
2个回答
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
投票

您可以安全,干净地使用以下代码。你不是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();
© www.soinside.com 2019 - 2024. All rights reserved.