我有这个数据库结构
orders ====► order_items ====► order_item_meta
║ |
║ |
▼ ▼
order_meta products
关系是订单具有许多order_items,其中有许多通过order_item_meta,订单也具有许多order_meta。 另外,order_items / product_id需要与产品表结合在一起。
我有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的数据,而不是来自产品表的数据。
在两种情况下,来自#3的数据都可以。
但是,如果我一起(使用#1 + with#2 + with3)一起执行所有三个操作,则得到的结果与case1相同。来自order_item_meta的数据丢失。
Orders.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...
);
}
}
OrderItem.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');
}
}
执行此查询的正确方法是什么?
答案 0 :(得分:0)
我通过在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']);
它有效