我有一个Campaign模型,我想为每个新广告系列创建一个slug。我可以使用可缓慢的行为轻松地做到这一点,这很棒,但我想从用户表中的first_name和last_name字段创建slug。
我该怎么做?我已经看过它在网上问了几次但从未回答过。当然有可能!?!
答案 0 :(得分:1)
假设您有一个Campaign属于User的关系,那么在您的Campaign模型中,只需覆盖beforeValidate()函数。您可以覆盖beforeSave(),但不会对slug进行验证。无论如何:
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;
}
答案 1 :(得分:0)
为什么要使用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();
对我来说似乎更容易。
答案 2 :(得分:0)
如果您打算使用可缓慢的行为并且两个字段来自同一模型 - 我过去使用的解决方案是:
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',
...
),
...
);
}
?>