【问题标题】:Laravel 5.6 Polymorphic relation with whereHasLaravel 5.6 与 whereHas 的多态关系
【发布时间】:2018-10-18 10:28:16
【问题描述】:

我在多态关系中遇到了一个问题,我无法让 whereHas 工作。基本上我有一个我想申请的“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:从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)

数据库表结构

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

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

【问题讨论】:

  • 你能告诉我你的表结构和你想得到什么数据吗??
  • @punk73 我更新了我的问题。我希望它现在清楚
  • Laravel 5.8.27 添加whereHasMorph():laravel.com/docs/…

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


【解决方案1】:

使用 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();

【讨论】:

  • 还没有解决方案,但此修复程序正在部分完成工作
  • 问题是 whereHas 方法不适用于多态关系
  • 这还会返回其部件 ID 具有 part_typesfd_part 类不同的订单。在sec_partsrmf_parts表中包含相同的ID。
【解决方案2】:

您可以安全干净地使用以下代码。你已经脱离了 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();

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 2020-12-23
    • 2021-05-25
    • 2016-09-11
    • 2014-11-29
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多