【问题标题】:CakePHP 3.X Multiple Model associationCakePHP 3.X 多模型关联
【发布时间】:2017-08-14 15:22:32
【问题描述】:

目前我有与“附件”模型相关联的“帖子”和“用户”模型,一切正常,因为我需要在每个表单中放置一个隐藏输入,告诉 CakePHP 我将使用哪个模型,就像下面的代码:

<?= $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?或者这是正确的做法?

【问题讨论】:

  • 根据Creating Inputs for Associated Data,您可以为相关数据创建输入,如下所示:echo $this-&gt;Form-&gt;control('tags.0.id'); 虽然我认为我误解了这个问题。您正在尝试编辑与Posts 关联的Attachments 对吗?如果是这样,我可以写一个更好的解释。

标签: php cakephp save polymorphic-associations cakephp-3.x


【解决方案1】:

您可以使用相应的表类beforeSave 和/或beforeMarshal 事件/回调来修改与当前表(模型)相关的附件数据,即注入表(模型)名称。

根据您想要应用的时间,您可以只使用其中的一个(仅/在编组之前 > 使用 beforeMarshal,仅保存 > 使用 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);
        }
    }
}

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多