我有一个包含相关数据的实体,我想将其保存在新记录中。我试试看:
$newTour = $this->Tours->get($id, ['contain' => ['Cities', 'Tags']]); $newTour->set('id', null); $this->Tours->save($newTour);
但我看到了这个错误:更新时需要所有主键值我该怎么办?
laik7k3q1#
通过get()或find()检索的实体将被设置为非新实体,这将导致它们在保存时在更新过程中结束,而不是在插入过程中结束。如果要将它们作为新记录插入,则除了取消设置主键之外,还必须将它们标记为新记录。
get()
find()
// ... $newTour->isNew(true); $newTour->unsetProperty('id'); // ...
另请参阅
*Cookbook〉数据库访问和ORM〉保存数据〉保存实体*操作手册〉数据库访问和ORM〉保存数据〉更新数据*API〉\蛋糕\数据源\实体特性::isNew()
hgb9j2n62#
请使用$newTour->unsetProperty('id');而不是$newTour->set('id', null);取消设置该属性
$newTour->unsetProperty('id');
$newTour->set('id', null);
5tmbdcev3#
一个重要的细节是,当我们有关联的表时,用->contain()选项,我们需要对每一个递归执行相同的操作,如下所示:
->contain()
$newTour->isNew(true); $newTour->unsetProperty('id'); $newTour->other_table->isNew(true); $newTour->other_table->unsetProperty('id');
3条答案
按热度按时间laik7k3q1#
通过
get()
或find()
检索的实体将被设置为非新实体,这将导致它们在保存时在更新过程中结束,而不是在插入过程中结束。如果要将它们作为新记录插入,则除了取消设置主键之外,还必须将它们标记为新记录。
另请参阅
*Cookbook〉数据库访问和ORM〉保存数据〉保存实体
*操作手册〉数据库访问和ORM〉保存数据〉更新数据
*API〉\蛋糕\数据源\实体特性::isNew()
hgb9j2n62#
请使用
$newTour->unsetProperty('id');
而不是$newTour->set('id', null);
取消设置该属性5tmbdcev3#
一个重要的细节是,当我们有关联的表时,用
->contain()
选项,我们需要对每一个递归执行相同的操作,如下所示: