CakePHP3 - создание нескольких ассоциаций между двумя одинаковыми записями - PullRequest
0 голосов
/ 19 июня 2020

У меня связь «многие ко многим» между счетами-фактурами и элементами. Позиция может появляться несколько раз в одном счете-фактуре, но с разными суммами (например, когда одна и та же услуга используется несколько раз в течение одного месяца).

Я надеялся, что смогу создать эту связь, включив в Элемент 'items' счета-фактуры при сохранении (см. https://book.cakephp.org/3/en/orm/saving-data.html#saving -belongstomany-association ):

Array
(
    [0] => Array
        (
            [id] => 1
            [_joinData] => Array
                (
                    [amount] => 5338.29
                )

        )

    [1] => Array
        (
            [id] => 1
            [_joinData] => Array
                (
                    [amount] => 5988.53
                )

        )

    [2] => Array
        (
            [id] => 1
            [_joinData] => Array
                (
                    [amount] => 6023.40
                )

        )
)

В приведенном выше примере я надеюсь, что три строки создаются в объединенной таблице invoices_items. Счет-фактура сохраняется правильно, но в таблице соединений создается только одна строка.

Одна из обеих ассоциаций, которую я пытался установить, saveStrategy на append (я не был уверен, что это делает), но это не так. 't help:

  $this->belongsToMany('Invoices', [
    'saveStrategy' => 'append'
  ]);

Можно ли добиться такого поведения из коробки, или мне нужно создать что-то более индивидуальное, например новую модель, чтобы специально отслеживать эти отношения? Пожалуйста, дайте мне знать, если дополнительный код поможет прояснить, чего я пытаюсь достичь.

Спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Кажется, ответ такой: нет, этот тип массового назначения невозможен. Решение, к которому я пришел, - это l oop по каждому элементу, который я хочу связать с недавно сохраненным счетом, и вызов link() для каждого. Я не знаю, какое снижение производительности для этого, но для моих целей это работает, поскольку эта операция в моем случае происходит относительно редко.

        // Build an array with an element per item
        ...
        $itemsJoinData[] = [
          'item' => $item,
          '_joinData' => [
            'amount' => $amount
          ]
        ];
        ...

После успешного сохранения счета-фактуры я прикрепляю элементы с соответствующими сумма.

        // Join up the invoice with the items
        foreach($itemsJoinData as $itemToJoin)  {
          $itemToJoin['item']->_joinData =  new Entity(['amount' => $itemToJoin['_joinData']['amount']], ['markNew' => true]); 
          $this->Invoices->Items->link( $invoice, [$itemToJoin['item']] );
        }
...