当条件不在id时,findOrNew返回数组而不是对象

时间:2016-08-02 10:22:11

标签: php laravel laravel-5.2

我有2个表usersuser_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);
}

我不喜欢,看起来不对劲!

2 个答案:

答案 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。