即使明显更改,关联数据也未保存

问题描述 投票:0回答:1

我似乎无法保存关联数据。

就我而言,可以看到对

ServiceLineEntries
的明显更改,但未保存。正在保存父对象 (
Requests
) 字段并按预期工作。

以下代码的输出:

starting at 4/10/24, 11:04 a.m.
project_manager: '', dirty: n
project_manager: 'Overflow, Stack', dirty: y
id: 24326, service_line_stage_id dirty: n
id: 24327, service_line_stage_id dirty: n
loop a - id: 24326, service_line_stage_id: 2, dirty: y
loop a - id: 24327, service_line_stage_id: 2, dirty: y
project_manager: 'Overflow, Stack'
loop b - id: 24326, service_line_stage_id: 1
loop b - id: 24327, service_line_stage_id: 1

代码:

public function myTest ()
{

    /*
    Requests Entity
        * @property \App\Model\Entity\ServiceLineEntry[] $service_line_entries

        protected $_accessible = [
            'service_line_entries' => true,
        ];

    Requests Table
        * @property \App\Model\Table\ServiceLineEntriesTable&\Cake\ORM\Association\HasMany $ServiceLineEntries

    ServiceLineEntries Entity

        protected $_accessible = [
        ...
        'service_line_stage_id' => true,
        ...
        ];

    ServiceLineEntries Table
        * @property \App\Model\Table\RequestsTable&\Cake\ORM\Association\BelongsTo $Requests
    */

    echo "starting at ".FrozenTime::now()."<br/>";

    //get record with association
    $request = $this->Requests->get(69311, [
        'contain' => [     
            'ServiceLineEntries',
        ],
    ]);

    //set project_manager
    echo "project_manager: '".$request->project_manager."', dirty: ".($request->isDirty('project_manager')?"y":"n")." <br/>";
    $request->project_manager = "Overflow, Stack";
    echo "project_manager: '".$request->project_manager."', dirty: ".($request->isDirty('project_manager')?"y":"n")." <br/>";

    //set service_line_stage_id
    foreach($request->service_line_entries as &$e)
    {
        echo "id: ".$e->id.", service_line_stage_id dirty: ".($e->isDirty('service_line_stage_id')?"y":"n")."</br>";
        $e->service_line_stage_id = 2;
        unset($e);
        //$e->setDirty('service_line_stage_id', true); doesn't help, isDirty() later seems to be true
    }

    //display value
    foreach($request->service_line_entries as $e)
    {
        echo "loop a - id: ".$e->id.", service_line_stage_id: ".$e->service_line_stage_id.", dirty: ".($e->isDirty('service_line_stage_id')?"y":"n")."</br>";
    }

    //save
    if($this->Requests->save($request, ['associated' => ['ServiceLineEntries']]))
    {
        //fetch fresh record with association
        $request2 = $this->Requests->get(69311, [
            'contain' => [     
                'ServiceLineEntries',
            ],
        ]);
        
        //display
        echo "project_manager: '".$request->project_manager."'<br/>";
        foreach($request2->service_line_entries as $e)
        {
            echo "loop b - id: ".$e->id.", service_line_stage_id: ".$e->service_line_stage_id."</br>";
        }
    }

    //no view, quit
    exit;
}
php cakephp orm cakephp-4.x
1个回答
0
投票

似乎对

ServiceLineEntries
关联数据的更改没有被保存。为了确保正确跟踪和保存更改,您需要手动将保存嵌套实体的属性标记为脏。在这种情况下,您可以在保存具有关联的
$request->setDirty('service_line_entries', true);
Requests
实体之前使用
ServiceLineEntries
。这将帮助 CakePHP ORM 跟踪更改并正确保存它们。

© www.soinside.com 2019 - 2024. All rights reserved.