我如何使用cakephp中的可拖拽行为使用来自不同表的字段来打个

| 我有一个Campaign模型,我想为每个新的Campaign创建一个标签。我可以通过出色的可拖拽行为轻松地做到这一点,但是我希望从users表中的first_name和last_name字段创建该slug。 我怎样才能做到这一点?我看过它在网上问过几次,但从未回答。当然可以!!!
已邀请:
假设您有一个Campaign属于用户的关系,那么在Campaign模型中,只需覆盖beforeValidate()函数即可。您可以改写beforeSave(),但是不会在段上进行验证。无论如何:
function beforeValidate() {
    $return = parent::beforeValidate();

    if(isset($this->data[\'User\'][\'first_name\']) && isset($this->data[\'User\'][\'last_name\'])) {
        // assumes we\'re saving a campaign and a user at the same time w/ saveAll
        $this->data[\'Campaign\'][\'slug\'] = $this->data[\'User\'][\'first_name\'] . \' \' . $this->data[\'User\'][\'last_name\'];
    } elseif(isset($this->data[\'Campaign\'][\'user_id\'])) {
        // saving Campaign record w/ just user_id passed
        $user = $this->User->find(\'first\', array(\'conditions\'=>array(\'User.id\'=>$this->data[\'Campaign\'][\'user_id\']), \'fields\'=>array(\'User.first_name\', \'User.last_name\')));
        if($user) {
            $this->data[\'Campaign\'][\'slug\'] = $user[\'User\'][\'first_name\'] . \' \' . $user[\'User\'][\'last_name\'];
        }
    }
    return $return;
}        
为什么要使用Sluggable行为?使用first_name和last_name作为参数的
Inflector::slug
方法难道不是很容易吗?像这样:
$name = sprintf(\'%s %s\', $first_name, $last_name);
$slug = Inflector::slug($name);
$this->Campaign->set(\'slug\', $slug);
$this->Campaign->save();
对我来说似乎更容易。
如果您要使用缓慢的行为,并且两个字段都来自同一模型,那么我过去使用的解决方案是: a)为用户模型设置虚拟字段
<?php
    class User extends AppModel
    {
        var $virtualFields = array(
            \'full_name\' => \'CONCAT(User.first_name, \" \", User.last_name)\'
        );
        ...
    }
?>
b)在virtualField上使用Sluggable行为。
<?php
    class User extends AppModel
    {
        ...
        public $actsAs = array(
            \'Sluggable\' => array(
                \'label\' => \'full_name\',
                ...
            ),
            ...
        );
    }
?>

要回复问题请先登录注册