【问题标题】:CakePHP3 - creating multiple associations between same two recordsCakePHP3 - 在相同的两条记录之间创建多个关联
【发布时间】:2020-06-19 11:39:52
【问题描述】:

发票和项目之间存在多对多关系。一个项目可以在同一张发票中出现多次,但金额不同(例如,当同一服务在一个月内多次使用时)。

我希望我可以通过在保存时在发票的“项目”元素中包含以下内容来创建此关联(请参阅https://book.cakephp.org/3/en/orm/saving-data.html#saving-belongstomany-associations):

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 的两个关联(我不确定这是做什么的),但这没有帮助:

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

是否可以开箱即用地实现这种行为,还是我需要创建一些更自定义的东西,比如专门跟踪这些关系的新模型?如果更多代码有助于阐明我想要实现的目标,请告诉我。

谢谢!

【问题讨论】:

标签: mysql cakephp-3.0


【解决方案1】:

答案似乎是不,这种批量分配是不可能的。 我得出的解决方案是遍历每个我想与新保存的发票关联的项目,并为每个项目调用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']] );
        }

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2013-04-22
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多