eloquent - 雄辩的 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');
}
}
执行此查询的正确方法是什么?
解决方案
我通过在 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']);
它有效
推荐阅读
- vue.js - 在 $navigateBack 中传递更改的道具
- android - ChipGroup单选
- google-maps - SAP Fiori 无法在第一次视图调用时创建地理编码器构造函数
- php - 为什么在我的 PHP 链接中插入字符?
- grpc-java - 使用 gRPC - 在 Spring 或 Dropwizard 等框架之间进行选择
- java - 休眠将 2 个 java 文件链接到同一个数据库表
- ruby-on-rails - Rubymine:使用已安装的 Puma-dev 进行调试?
- hibernate - 休眠二级缓存的应用程序属性
- cassandra - 在 Cassandra 中对结果进行排序
- nlp - 使用 CoreNLP 将句子分割成子句