我一直坚持这个问题一段时间了,我似乎无法找到我的代码有什么问题。我有以下3个表,其中零售商有许多客户,客户可以有许多零售商,这是CakePHP 3中的属于关系.2之间的关系存储在clients_retailers表中。
class ClientsTable extends Table
{
...
$this->belongsToMany('Retailers', [
'joinTable' => 'clients_retailers'
]);
}
class RetailersTable extends Table
{
public function initialize(array $config)
{
...
$this->belongsToMany('Clients', [
'joinTable' => 'clients_retailers'
]);
}
}
class ClientsRetailersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('clients_retailers');
$this->displayField('client_id');
$this->primaryKey(['client_id', 'retailer_id']);
$this->belongsTo('Clients', [
'foreignKey' => 'client_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Retailers', [
'foreignKey' => 'retailer_id',
'joinType' => 'INNER'
]);
}
}
然后在客户端控制器的添加功能中,我试图在新客户端和零售商之间保存这种关系。
public function add()
{
$client = $this->Clients->newEntity();
if ($this->request->is('post')) {
$retailer_id = $this->Auth->user('retailer_id');
$retailer = [
'retailers' => [
[
'id' => $retailer_id
]
]
];
$client = $this->Clients->patchEntity($client, $this->request->data);
$client = $this->Clients->patchEntity($client, $retailer, ['associated' => [
'Retailers'
]]);
if ($this->Clients->save($client)) {
$this->Flash->success(__('The client has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The client could not be saved. Please, try again.'));
}
}
}
新客户端永远不会添加到数据库中。我在网上看到它可能是一个验证问题所以我尝试使用['validate' => false]
,但它似乎没有改变任何东西。保存功能失败,没有错误。
最糟糕的是,当从api控制器中的另一个函数调用时,此关系曾经被正确保存。我当然试过复制它,但它似乎不能在这个控制器中工作。有谁知道问题可能是什么。非常感谢!
更新: 这是我要保存的客户端实体值
object(App\Model\Entity\Client) {
'firstname' => 'test',
'lastname' => 'test',
'email' => 'test@email.com',
'password' => 'hash',
'retailers' => [
(int) 0 => object(App\Model\Entity\Retailer) {
'id' => '1',
'name' => 'TestRetailer',
'created' => object(Cake\I18n\Time) {
'time' => '2017-12-20T20:13:58+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'modified' => object(Cake\I18n\Time) {
'time' => '2017-12-20T20:13:58+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'[new]' => false,
'[accessible]' => [
'*' => true,
'id' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Retailers'
}
],
'[new]' => true,
'[accessible]' => [
'*' => true,
'id' => true
],
'[dirty]' => [
'firstname' => true,
'lastname' => true,
'email' => true,
'password' => true,
'retailers' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Clients'
}
答案 0 :(得分:0)
您需要更改代码才能正常工作,
public function add()
{
$client = $this->Clients->newEntity();
if ($this->request->is('post')) {
$retailer_id = 'XXXXXX'
$retailer = [
'retailers' => [
[
'id' => $retailer_id
]
]
];
$client = $this->Clients->patchEntity($client, $this->request->data, ['validate' => false]); //Validation false
$client = $this->Clients->patchEntity($client, $retailer, ['associated' => [
'Retailers' => ['validate' => false] //You need to disable validation here too
]]);
if ($this->Clients->save($client)) {
$this->Flash->success(__('The client has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The client could not be saved. Please, try again.'));
}
}
}
答案 1 :(得分:0)
我终于弄明白了问题所在。我在客户端的查找功能上有一个beforeFind行为。表和我没有意识到这导致保存失败