Красноречивый hasMany с hasMany и объединение в середине - PullRequest
0 голосов
/ 04 июля 2019

У меня есть эта структура базы данных.

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

Отношения - это заказы.Кроме того, 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

Кажется, что с # 1 и с # 2 мешают друг другу.

Case1: Если я делаю с # 1 + с # 3,Я могу видеть в результате данные из таблицы продуктов + данные из order_items, но не данные из order_item_meta.

Case2: если я делаю с # 2 + с # 3, я могусм. в результате данные из order_items + данные из order_item_meta, но не из таблицы продуктов.

В обоих случаях данные из # 3 в порядке.

Но если я сделаю все три вместе (с # 1 + с # 2 + с3), я получу те же результаты, что и 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');
    }
}

Как правильно сделать этозапрос

1 Ответ

0 голосов
/ 05 июля 2019

Я решил это, добавив отношение между 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']);

и это работает

...