我有2个表users
和user_meta
在我的users
模型中
function meta() {
return $this->hasOne('App\userMeta');
}
当我想保存用户和用户元时,在我的控制器中
function store( Request $request , $id = 0 ) {
$user = User::findOrNew($id);
$user->save() ;
$meta = UserMeta::findOrNew(['user_id'=>$id]);
$user->meta()->save($meta);
}
当我试图保存meta时出现此错误
参数1传递给 Illuminate \ Database \ Eloquent \ Relations \ HasOneOrMany :: save()必须是 Illuminate \ Database \ Eloquent \ Model的一个实例,
这里是问题UserMeta::findOrNew(['user_id'=>$id])
返回一个数组而不是对象...这很奇怪..而User::findOrNew($id)
本身返回和对象....我猜这是因为我的条件(它是2查询之间的唯一区别)
现在我必须做这样的事情
$meta = UserMeta::findOrNew(['user_id'=>$id]);
if(is_array($meta)) {
$user->meta()->save($meta[0]);
} else {
$user->meta()->save($meta);
}
我不喜欢,看起来不对劲!
答案 0 :(得分:3)
函数findOrNew()可能不是你想要的。 它的用途如下:
// the array in the second parameter specifies which columns are
// included in the resulting model (if found)
// it is NOT used as a WHERE clause
$meta = UserMeta::findOrNew($id, ['user_id'=>$id]);
您在寻找什么:
// adds where clause (returns new model if it does not exist)
$meta = UserMeta::firstOrNew(['user_id' => $id]);
// same as above but persists new model to database
$meta = UserMeta::firstOrCreate(['user_id' => $id]);
为什么firstOrNew()在您的案例中没有返回单个模型的原因:
这是findOrNew Illuminate \ Database \ Eloquent \ Builder.php的实现:
public function findOrNew($id, $columns = ['*'])
{
if (! is_null($model = $this->find($id, $columns))) {
return $model;
}
return $this->model->newInstance();
}
如您所见,第一个参数不适用于列。
如果您查看 $ this->中的查找方法,请查找($ id,$ columns) 你会看到:
public function find($id, $columns = ['*'])
{
if (is_array($id)) {
return $this->findMany($id, $columns);
}
$this->query->where($this->model->getQualifiedKeyName(), '=', $id);
return $this->first($columns);
}
当您将数组作为$ id传递时,将返回$ this-> findMany()的结果,这是一个Collection。
答案 1 :(得分:1)
也许你应该使用FirstOrCreate而不是findOrNew。