gpt4 book ai didi

cakephp - 蛋糕 3 : How to add new entity to database with primaryKey set?

转载 作者:行者123 更新时间:2023-12-04 13:59:39 40 4
gpt4 key购买 nike

我想用从 Excel 工作表中提取的“平面”数据填充我的数据库。所有记录都以数组形式提供(类似于 $request->data),但它们的主键设置了必须保留的值。
我的代码:

$imported = 0;  
foreach ($data as $record) {
$entity = $table->findOrCreate([$table->primaryKey() => $record[$table->primaryKey()]]);
$entity = $table->patchEntity($entity, $record);
if ($table->save($entity)) {
$imported++;
}
}

该代码有效,但我想知道是否有更好的解决方案?

澄清:我想要的是添加类似的东西
 [  
['id' => 25, 'title'=>'some title'],
['id'=> 3, 'title' => 'some other title'],
['id' => 4356, 'title' => 'another title']
]

到我的空数据库。 findOrCreate() 完成这项工作。但我认为没有必要在插入之前测试数据库中不存在的每条记录。

最佳答案

记录神秘地丢失一些提供给新的数据的常见问题 Entity是实体没有将相关字段定义为 _accessible .

Cake 的 BakeShell 在为你生成新的实体类时会跳过主键字段,例如:

<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;

/**
* Widget Entity.
*/
class Widget extends Entity {

/**
* Fields that can be mass assigned using newEntity() or patchEntity().
*
* @var array
*/
protected $_accessible = [
// `id` is NOT accessible by default!
'title' => true,
];
}

有几种方法可以解决这个问题。

您可以修改您的实体类以制作 id领域 永久可分配:
    protected $_accessible = [
'id' => true, // Now `id` can always be mass-assigned.
'title' => true,
];

或者您可以将您的电话调整为 newEntity()禁用批量分配保护:
$entities = $table->newEntity($data, [
'accessibleFields' => ['id' => true],
]);

我发现当您遇到 Cake 3 DB 数据问题时,最重要的一点是在创建或修补实体后立即仔细检查实体,并将其与输入数据进行比较。你仍然需要有敏锐的眼光,但这样做会揭示实体没有他们的 ->id即使设置了属性 $data定义了它们。

关于cakephp - 蛋糕 3 : How to add new entity to database with primaryKey set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373150/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com