0

用这样的结构说。,列是:

名字 | 第二个名字 | 中间名 | 姓

现在,假设我有一个需要输入“名称”的表单......但没有指定它是什么类型的名称。

在控制器上,我必须检查该“名称”是否在数据库中。

我这样做:

public function actionCheckName($name){

$name = PersonName::model()->findByAttributes(array('first_name'=> $name));
//then check if the name exists in the first_name column

if(!empty($name)){
$name = PersonName::model()->findByAttributes(array('second_name'=> $name));
}
//if it's not in the first_name column...check in the second_name column

..
..and so on, i hope you get the idea

}

我基本上不知道用户输入的名称是什么类型...但是如果该条目存在,我必须在数据库中检查..是否是这些名称类型之一。

上面的代码有效。但看起来......有点......不太好......有没有更好的方法来做到这一点?非常感谢!

4

2 回答 2

3
        $criteria=new CDbCriteria;
        $criteria->compare('first_name', $name, false, 'OR'); // The 3th param determine if the string comparation use "LIKE" or "="
        $criteria->compare('second_name', $name, false, 'OR');
        $criteria->compare('middle_name', $name, false, 'OR');
        $criteria->compare('last_name', $name, false, 'OR');

        $nameList = PersonName::model()->findAll($criteria); // Return all PersonName with $name in any field.

        $name = PersonName::model()->find($criteria); // Return the first PersonName with $name in any field.
于 2013-09-20T06:50:08.767 回答
2

我认为你可以使用这样的标准

$q = new CDbCriteria( array(
'condition' => "first_name LIKE ':first_name%' || last_name LIKE ':lname%'... and so on",     
'params'    => array(':first_name' => $fname,':lname'=>$lname .. and so on)

));

$name = PersonName::model()->find($q);
于 2013-09-20T06:58:25.863 回答