保存需要唯一的关联模型数据

时间:2012-04-09 09:45:06

标签: php cakephp

我构建了一个CakePHP应用程序,允许用户创建帖子并为其添加标签(主题)。数据库和关联的结构可以在这里看到:Setting up contains for a join table in CakePHP

我已成功通过连接表使用Contain将数据拉出。但是现在我正在尝试构建用户输入主题的部分,然后将其保存在主题表和Topic_post表中。

我有以下代码我添加新帖子方法:

if ($this->request->is('post'))
        {
            //$this->Post->create();

            if ($this->Post->save($this->request->data))
            {
                // Save extra data
                $this->Post->saveField('user_id', $this->Auth->user('id'));
                $this->Post->saveField('datetime', date('Y-m-d H:i:s'));
                $this->Post->saveField('modified', date('Y-m-d H:i:s'));
                $this->Post->saveField('status', 1);

                // Build slug
                $post_title = Sanitize::html($this->request->data['Post']['title'], array('remove'=>true, 'quotes' => ENT_NOQUOTES));
                $post_title = String::truncate($post_title, 50, array('exact'=>false,'html'=>false,'ending'=>''));
                $this->Post->saveField('slug', Inflector::slug($post_title));

                // Redirect the user to the newly created post (pass the slug for performance)
                $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($this->Post->id),'slug'=>$this->Post->slug));
            }
            else
            {
                $this->Session->setFlash('Server broke!');
            }
        }

所以我现在需要做的是保存在视图中输入的相关主题数据:

<?php echo $this->Form->create(); ?>

<?php echo $this->Form->input('Post.title'); ?>

<?php echo $this->Form->input('Post.content', array('type'=>'textarea','label'=>false)); ?>

<?php echo $this->Form->input('Topic.title', array('type'=>'textarea','label'=>'Topics')); ?>

<button type="submit" class="orangeButton small">Create</button>

<?php echo $this->Form->end(); ?>

我看过CakePHP文档,看起来像saveAll就是我需要的东西?但我很困惑,因为我不是100%确定如何使用它也很重要的是要注意用户可以将多个主题保存到数据库,并且主题本身都是唯一的,例如你不能创建一个已经存在的主题只是使用链接器的现有id。

有人可以帮忙吗?我觉得这很复杂......

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:


$this->Post->saveAll($this->data, array('validate'=>'first'));

使用数组('validate'=&gt;'first');确保在保存之前验证我们的两个模型。你的意思是那样的。

希望有所帮助