首页 > 解决方案 > 雄辩的 hasMany 与 hasMany 和中间的连接

问题描述

我有这个数据库结构

orders ====►  order_items  ====►  order_item_meta
  ║                |
  ║                |
  ▼                ▼
order_meta      products

关系是orders hasMany order_items which hasManyThrough order_item_meta,orders也有Many order_meta。此外,order_items/product_id 需要与 products 表连接。

我有 order_id,我正试图在一次调用中获取全部数据。但我有一个奇怪的问题。这是当前代码:

    $orders = Orders::
        with([
            'order_items' => function($q) {  //#1
                $q->leftJoin('products','order_items.product_id', '=', 'products.id');
            }
        ])
        ->with(['order_items.orderitem_meta'])  //#2
        ->with(['order_meta']);  //#3

似乎 with#1 和 with#2 相互干扰。

案例1:如果我使用#1+with#3,我可以在结果中看到来自产品表的数据+来自 order_items 的数据,但看不到来自 order_item_meta 的数据。

案例2:如果我使用#2+with#3,我可以在结果中看到来自 order_items 的数据 + 来自 order_item_meta 的数据,但看不到来自产品表的数据。

在这两种情况下,来自 with#3 的数据都可以。

但是,如果我将这三个一起做(with#1+with#2+with3),我会得到与 case1 相同的结果。来自 order_item_meta 的数据丢失。

订单.php

class Orders extends Model
{

    public function order_items()
    {
        return $this->hasMany('App\OrderItem','order_id','id'); //'foreign_key', 'local_key'
    }

    public function order_meta()
    {
        return $this->hasMany('App\OrderMeta','order_id','id'); //'foreign_key', 'local_key'
    }

    public function orderitem_meta()
    {
        return $this->hasManyThrough(
            'App\OrderItem',
            'App\OrderItemMeta',
            'order_item_id', // Foreign key on order_itemmeta table...
            'order_id', // Foreign key on order_item table...
            'id', // Local key on order_item table...
            'id' // Local key on order_itemmeta table...            
        ); 
    }    

}

订单项.php

class OrderItem extends Model
{

    public function order()
    {
        return $this->belongsTo('App\Orders');
    }

    public function orderitem_meta()
    {
        return $this->hasMany('App\OrderItemMeta','order_item_id','id'); //'foreign_key', 'local_key'
    }

}

OrderItemMeta.php

class OrderItemMeta extends Model
{
    protected $table = 'order_itemmeta';

    public function orderitem()
    {
        return $this->belongsTo('App\OrderItem');
    }
}

执行此查询的正确方法是什么?

标签: eloquenteloquent-relationship

解决方案


我通过在 order_items 和产品之间添加关系来解决它:

在 OrderItem.php

public function product()
{
    return $this->hasOne('App\Products','id','product_id'); //'foreign_key', 'local_key'
}

然后查询变成这样:

$orders = Orders::
        with(['order_items.orderitem_meta','order_items.product','order_meta']);

它有效


推荐阅读