CakePHP patchEntity 不保存数据(“通过”关联)

Posted

技术标签:

【中文标题】CakePHP patchEntity 不保存数据(“通过”关联)【英文标题】:CakePHP patchEntity not saving data ("through" association) 【发布时间】:2016-11-23 07:28:13 【问题描述】:

我是 Cakephp 的新手,我一直在使用 CakePHP 食谱和 *** 来尝试解决我的问题,但无法解决。这可能有点傻。

我有 Quotes、Items 和可连接的 joindata QuotesItems。

我的 edit.ctp(模板引用)中有这个:

<div class="quotes form large-9 medium-8 columns content">
    <?= $this->Form->create($quote) ?>
    <fieldset>
        <legend><?= __('Edit Quote') ?></legend>
        <?php
            echo $this->Form->input('customer_id', ['options' => $customers]);
            echo $this->Form->input('items._ids', ['options' => $items]);
        $counter = 0;
        foreach($quote['items'] as $item):
            echo $this->Form->input( "items.$counter.description", array( 'disabled' => 'disabled' ) );
            echo $this->Form->input("items.$counter._joinData.item_quantity");
            $counter++;
        endforeach
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>

在我有编辑功能的 QuotesController 中:

    public function edit($id = null)
    
        $quote = $this->Quotes->get($id, [
            'contain' => ['Items']
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) 
            $quote = $this->Quotes->patchEntity($quote, $this->request->data, ['Quotes._joinData']);
            //$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]] );
            if ($this->Quotes->save($quote)) 
debug($this->request->data);
                $this->Flash->success(__('The quote has been saved.'));

                //return $this->redirect(['action' => 'index']);
             else 
                $this->Flash->error(__('The quote could not be saved. Please, try again.'));
            
        
        $customers = $this->Quotes->Customers->find('list', ['limit' => 200]);
        $items = $this->Quotes->Items->find('list', ['limit' => 200]);
        $this->set(compact('quote', 'customers', 'items'));
        $this->set('_serialize', ['quote']);
    

表单保存时发送的数组为:

[
    'customer_id' => '1',
    'items' => [
        '_ids' => [
            (int) 0 => '1'
        ],
        (int) 0 => [
            '_joinData' => [
                'item_quantity' => '18'
            ]
        ]
    ]
]

我已经检查了食谱的保存“保存数据”,但它没有清除我做错了什么。

数据需要报价的ID吗?我迭代项目的方式是否正确?

表关联如下: 引用:

    $this->belongsToMany('Items', [
        'through' => 'QuotesItems'
    ]);

项目:

    $this->belongsToMany('Quotes', [
        'through' => 'QuotesItems'
    ]);

QuotesItems(可连接):

    $this->belongsTo('Quotes', [
        'foreignKey' => 'quote_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('Items', [
        'foreignKey' => 'item_id',
        'joinType' => 'INNER'
    ]);

提前致谢!

【问题讨论】:

【参考方案1】:

尝试使数组格式如下:

[
 'customer_id' => '1',
 'items' => [
    'id' => 1, // this is primary key of items table
    'item_quantity' => '18' // this is another field of items table
    ]
]

并且在您的编辑方法中使用注释行:

$quote = $this->Quotes->patchEntity($quote, $this->request->data, ['associated'=>['QuotesItems'=>['associated'=>['Items']]]] );

【讨论】:

感谢您的回复。当我将您提到的行放在控制器中时,我得到一个异常“无法为“QuoteItems”关联编组数据。它与“报价”无关。除此之外,我很惊讶 cakePhp 无法通过使用 cake bake 命令来处理这样的“基本”场景,并且我不得不修改数据(我可以在不同的场景中理解,但这似乎是基本的)。虽然 cakephp 有很多文档,但并没有真正解释清楚。 忘了说:我看到你在项目下面有 ID。还有 item_quantity。这不应该嵌套在 _joinData 中吗?我确实有一个可连接的主键,所以我希望它在数据中也是必要的?提前致谢。 是的,如果表处于正确的关系中,并且没有嵌套在 _joinData 中。我之前检查过,效果很好。 如果这样的事情变得更难,那么删除和重新插入也可能是更好的选择。 "是的,如果表的关系正确,可以不嵌套在 _joinData 中工作。我之前检查过,效果很好。"

以上是关于CakePHP patchEntity 不保存数据(“通过”关联)的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3:保存关联模型失败

CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段

Cakephp 3 - 使用_joinData属于ToMany

Cakephp 3.7 hasOne字段数据不保存

调试save()返回false CakePHP 3.0

cakephp新字段不保存