Я ударился головой о стену, пытаясь понять, почему мои электронные письма (принадлежат «Гостям» (принадлежит многому электронному письму)) не будут экономить. Когда я пытаюсь сохранить модель электронной почты со связанными данными (гостями), она не работает в $ this-> Emails-> save ($ email) с:
Неизвестный тип "" Ошибка InvalidArgumentException
Я следил за примером CakeBookmarks ( http://book.cakephp.org/3.0/en/tutorials-and-examples/bookmarks/intro.html ) в tee в этот момент для отношений и формы редактирования. И даже построил его и вытащил из него код.
Вот соответствующий код из моего проекта, любая помощь или спекуляция оцениваются:
Создать инструкцию для таблицы соединений emails_guests:
CREATE TABLE emails_guests ( email_id INT NOT NULL, guest_id INT NOT NULL, PRIMARY KEY (email_id, guest_id), FOREIGN KEY guest_key(guest_id) REFERENCES guests(id), FOREIGN KEY email_key(email_id) REFERENCES emails(id) );
EmailsTable :: Initialize
public function initialize(array $config) { // parent::initialize($config); $this->table('emails'); $this->displayField('title'); $this->primaryKey('id'); $this->addBehavior('Timestamp'); $this->belongsToMany('Guests', [ 'foreignKey' => 'email_id', 'targetForeignKey' => 'guest_id', 'joinTable' => 'emails_guests' ]); }
GuestsTable :: инициализировать
public function initialize(array $config){ parent::initialize($config); $this->table('guests'); $this->displayField('name'); $this->primaryKey('id'); $this->addBehavior('Timestamp'); $this->belongsTo('Invitations', [ 'foreignKey' => 'invitation_id' ]); $this->hasMany('Messages', [ 'foreignKey' => 'guest_id' ]); $this->belongsTo('SeatingGroups', [ 'foreignKey' => 'seating_group_id' ]); $this->belongsToMany('Emails', [ 'foreignKey' => 'guest_id', 'targetForeignKey' => 'email_id', 'joinTable' => 'emails_guests' ]); }
Электронная почта создает / обновляет вид manage.ctp
<?= $this->Form->create($email); ?> <div class="row"> <div class="col-sm-12"> <?= $this->Form->input('title', ['id' => false]); ?> </div> </div> <div class="row"> <div class="col-sm-12"> <?= $this->Form->input('subject'); ?> </div> </div> <div class="row"> <div class="col-sm-12"> <?= $this->Form->input('message', ['class'=>'email-body']); ?> </div> </div> <div class="row"> <div class="col-sm-6"> <?= $this->Form->input( 'guests._ids', [ // 'type' => 'select', 'options' => $guests, // 'multiple' => true, // 'empty' => 'Please select the recipients.', // 'label'=>'Recipients' ] ); ?> </div> <div class="col-sm-6"> <div class="row"> <div class="col-sm-12"> <?= $this->Form->input('send_by', ['id' => 'send-by', 'type' => 'text']); ?> </div> </div> <div class="row"> <div class="col-sm-6"> <?= $this->Form->checkbox('now'); ?> <label for="now">Send Now</label> </div> <div class="col-sm-6"> <?= $this->Form->input( __('Save'), [ 'type' => 'submit', 'class' => 'inline', 'label' => false ] ) ?> </div> </div> </div> </div> <div class="row"> <div class="col-sm-12"> </div> </div> <div class="clearfix"></div> <?= $this->Form->end() ?>
И, наконец, диспетчер управляет сохраненным вопросом:
public function manage($id = null) { $this->set('title', 'Manage Emails'); if(isset($id)) { $email = $this->Emails->get($id, [ 'contain' => ['Guests'] ]); $this->set('title', 'Email: ' . $email->title); } else { $email = $this->Emails->newEntity(); $this->set('title', 'Create Email'); } if ($this->request->is(['patch', 'post', 'put'])) { debug($email); $email = $this->Emails->patchEntity($email, $this->request->data); debug($email); debug($this->request->data); if ($this->Emails->save($email)) { if($email->now == true) { $this->process($email->id, $id); } $this->Flash->success('The email has been saved.'); return $this->redirect(['action' => 'manage', $email->id]); } else { $this->Flash->error('The email could not be saved. Please, try again.'); } } $guests = $this->Emails->Guests->find('list')->select(['id', 'first_name', 'last_name', 'email'])->toArray(); $this->set('email', $email); $this->set('guests', $guests); $emails = $this->Emails->find(); $this->set('emails', $this->paginate($emails)); $this->set('_serialize', ['emails']); }
Данные запроса, когда я сохраняю электронное письмо и выбираю одного или нескольких гостей (что вызывает ошибку недопустимого типа):
[ 'title' => 'Test Email Edit', 'subject' => 'Hi! {{guest.first_name}}, we're testing some new features!2', 'message' => 'Hi {{guest.first_name}} {{guest.last_name}}, We're testing some new features with recursive data. Let me tell you a bit about you: Your seating group is: {{guest.seating_group.name}}. Your invitation is: {{guest.invitation.name}} Which we sent to: {{guest.invitation.address}} Thanks! Hope this comes out okay... ', 'guests' => [ '_ids' => [ (int) 0 => '1' ] ], 'send_by' => '', 'now' => '0' ]
Трассировки стека:
⟩ Cake\Database\Type::build CORE/src/ORM/Table.php, line 1552 ⟩ Cake\ORM\Table->_newId CORE/src/ORM/Table.php, line 1489 ⟩ Cake\ORM\Table->_insert CORE/src/ORM/Table.php, line 1436 ⟩ Cake\ORM\Table->_processSave CORE/src/ORM/Table.php, line 1367 ⟩ Cake\ORM\Table->Cake\ORM\{closure} CORE/src/Database/Connection.php, line 561 ⟩ Cake\Database\Connection->transactional CORE/src/ORM/Table.php, line 1368 ⟩ Cake\ORM\Table->save CORE/src/ORM/Association/BelongsToMany.php, line 557 ⟩ Cake\ORM\Association\BelongsToMany->_saveLinks CORE/src/ORM/Association/BelongsToMany.php, line 506 ⟩ Cake\ORM\Association\BelongsToMany->_saveTarget CORE/src/ORM/Association/BelongsToMany.php, line 750 ⟩ Cake\ORM\Association\BelongsToMany->Cake\ORM\Association\{closure} CORE/src/Database/Connection.php, line 561 ⟩ Cake\Database\Connection->transactional CORE/src/ORM/Association/BelongsToMany.php, line 769 ⟩ Cake\ORM\Association\BelongsToMany->replaceLinks CORE/src/ORM/Association/BelongsToMany.php, line 445 ⟩ Cake\ORM\Association\BelongsToMany->saveAssociated CORE/src/ORM/AssociationCollection.php, line 254 ⟩ Cake\ORM\AssociationCollection->_save CORE/src/ORM/AssociationCollection.php, line 230 ⟩ Cake\ORM\AssociationCollection->_saveAssociations CORE/src/ORM/AssociationCollection.php, line 195 ⟩ Cake\ORM\AssociationCollection->saveChildren CORE/src/ORM/Table.php, line 1447 ⟩ Cake\ORM\Table->_processSave CORE/src/ORM/Table.php, line 1367 ⟩ Cake\ORM\Table->Cake\ORM\{closure} CORE/src/Database/Connection.php, line 561 ⟩ Cake\Database\Connection->transactional CORE/src/ORM/Table.php, line 1368 ⟩ Cake\ORM\Table->save APP/Controller/EmailsController.php, line 61 ⟩ App\Controller\EmailsController->manage [internal function] ⟩ call_user_func_array CORE/src/Controller/Controller.php, line 411 ⟩ Cake\Controller\Controller->invokeAction CORE/src/Routing/Dispatcher.php, line 114 ⟩ Cake\Routing\Dispatcher->_invoke CORE/src/Routing/Dispatcher.php, line 87 ⟩ Cake\Routing\Dispatcher->dispatch ROOT/webroot/index.php, line 37
Он должен хорошо работать в соответствии с документами и примерами. Заранее спасибо!
Похоже, что что-то не так с помощью схемы чтения / кэширования, или вы определяете неправильный первичный ключ для класса таблицы соединений. С составным первичным ключом, похожим на тот, который вы показываете здесь, он никогда не должен доходить до точки в коде, где это выкидывание выбрасывается.
Удалите tmp/cache/models/
, и в случае, если у вас есть класс EmailsGuestsTable
, проверьте, что и что он устанавливает через Table::primaryKey()
, в случае использования он должен быть
['email_id', 'guest_id']
Возможно, у вашей таблицы первоначально был другой первичный ключ, и вы впоследствии внесли изменения в него, не очищая кеш и / или не обновляя соответствующий класс таблицы.