Красноречивое ограничение загрузки по значениям родительского столбца не работает - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующие таблицы:

shipment
==========
date document_no address_id
----------------------------
2018-11-20 SO-18-11971 0
2018-11-20 SO-18-11971 1
2018-11-21 SO-18-11972 0


item
=======
shipment_date document_no address_id
-------------------------------------
2018-11-20 SO-18-11971 0
2018-11-20 SO-18-11971 1
2018-11-21 SO-18-11972 0

и ниже - Модели;

class Shipment extends Model {

    protected $table = 'shipment';

    public function items()
    {
        return $this->hasMany(Item::class, 'document_no', 'document_no')
            ->where(['shipment_date' => $this->date, 'address_id' => $this->address_id]);
    }
}

class Item extends Model {

    protected $table = 'item';
}

Я пытался получить данные для API;

return Shipment::with('items')->where('date', $shipment_date)->get()->toArray();

но я становлюсь пустым items.Но странно, я получаю данные items, когда использую это;Shipment::find($id)->items.Что я пропустил?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Невозможно использовать $this в отношениях в сочетании с энергичной загрузкой.

Посмотрите на этот пакет: https://github.com/topclaudy/compoships

0 голосов
/ 22 ноября 2018

это отношение не будет работать правильно, потому что структура неверна.попробуйте вот так

shipments
==========
id date document_no address_id
----------------------------
1 2018-11-20 SO-18-11971 0
2 2018-11-20 SO-18-11971 1
3 2018-11-21 SO-18-11972 0


item
=======
shipment_id
-------------------------------------
1
2
3

Меньше избыточности и эффективнее.в моем примере отношение будет

class Shipment extends Model {

    public function items()
    {
        return $this->hasMany(Item::class);
    }
}

. Я изменил имя таблицы с shipment на shipments, поэтому вам не нужно объявлять таблицу или внешний ключ.

при этом Eloquent (и Laravel) не поддерживает многоключевой индекс в отношениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...