我在Yii Framework中寻找一个等效的Rails方法,该类在类级别上找到基于ActiveRecord需要匹配的传入数组的现有记录。如果找到,这将返回匹配的ActiveRecord。如果未找到,则返回新实例化的ActiveRecord。
以下是我希望它看起来如何的示例:
$person = Person::model()->find_or_initialize_by(array('name'=>'bob','age'=>20));
答案 0 :(得分:0)
但是yii中没有这样的内置函数,这是可用的内置函数
http://www.yiiframework.com/doc/api/1.1/CActiveRecord#find-detail,
您可以在模型中使用此自定义功能
public function find_or_initialize_by($array){
$model = Person::model()->find('name=:name AND age=:age',array(':name'=>$array["name"],':age'=>$array["age"]));
if($model == null){
$model = new Person;
}
$model->name = $array["name"];
$model->age = $array["age"];
$model->save();
}
答案 1 :(得分:0)
您可以通过扩展它来将其添加到核心CActiveRecord。在protected / components / ActiveRecord.php中,添加:
class ActiveRecord extends CActiveRecord
{
public static function find_or_initialize_by($params)
{
if( ! $model = static::model()->findByAttributes($params) )
{
$model = new static();
foreach($params as $name => $value)
$model->$name = $value;
}
return $model;
}
}
然后你可以这样称呼它:
$person = Person::find_or_initialize_by(array('name'=>'bob','age'=>'20'));