CakePHP 3.X多模型关联
目前,我有一个与“附件”模型相关联的“帖子”和“用户”模型,一切都可以完美地执行,因为我需要在每个表单中添加一个隐藏的输入,告诉CakePHP我将使用哪个模型,就像下面的代码一样:CakePHP 3.X多模型关联,php,cakephp,save,polymorphic-associations,cakephp-3.x,Php,Cakephp,Save,Polymorphic Associations,Cakephp 3.x,目前,我有一个与“附件”模型相关联的“帖子”和“用户”模型,一切都可以完美地执行,因为我需要在每个表单中添加一个隐藏的输入,告诉CakePHP我将使用哪个模型,就像下面的代码一样: <?= $this->Form->create($post); ?> <fieldset> <legend>Create a new Post</legend> <?php echo $this->Form-&g
<?= $this->Form->create($post); ?>
<fieldset>
<legend>Create a new Post</legend>
<?php
echo $this->Form->input('title');
echo $this->Form->input('content');
echo $this->Form->hidden('attachments.0.model', ['default' => 'Post']);
echo $this->Form->control('attachments.0.image_url');
echo $this->Form->hidden('attachments.1.model', ['default' => 'Post']);
echo $this->Form->control('attachments.1.image_url');
?>
</fieldset>
<?= $this->Form->button(__('Save Post')); ?>
<?= $this->Form->end(); ?>
创建新帖子
有没有办法告诉Cake我将为每个模型/控制器使用哪个Attachment.model?或者这是正确的方法?您可以使用相应的表类
beforeSave
和/或beforemashall
事件/回调来修改与当前表(模型)相关的附件数据,即插入表(模型)名称
根据您希望应用这些内容的时间,您可以只使用其中一个(仅/在编组之前>使用beforemashall
,仅保存>使用beforeSave
),甚至两者都可以
下面是一个基本示例,它在编组和保存阶段都无条件注入当前表名:
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;
// ...
public function beforeMarshal(Event $event, \ArrayObject $data, \ArrayObject $options)
{
if (isset($data['attachments']) &&
is_array($data['attachments'])
) {
$alias = $this->registryAlias();
foreach ($data['attachments'] as &$attachment) {
$attachment['model'] = $alias;
}
}
}
public function beforeSave(Event $event, EntityInterface $entity, \ArrayObject $options)
{
$attachments = $entity->get('attachments');
if (is_array($attachments)) {
$alias = $this->registryAlias();
foreach ($attachments as $attachment) {
$attachment->set('model', $alias);
}
}
}
另见
echo$this->Form->control('tags.0.id')虽然我想我误解了这个问题。您正在尝试编辑与帖子相关的附件
,对吗?如果是这样,我可以写一个更好的解释。