Php 当条件不在id上时,findOrNew返回数组而不是对象
我有两个表Php 当条件不在id上时,findOrNew返回数组而不是对象,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,我有两个表users和user\u meta 在我的用户模型中,我有 function meta() { return $this->hasOne('App\userMeta'); } 在我的控制器中,当我要保存用户和用户元时 function store( Request $request , $id = 0 ) { $user = User::findOrNew($id); $user->save() ; $meta = UserMet
users
和user\u meta
在我的用户
模型中,我有
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);
}
当我试图保存元我得到这个错误
参数1传递给
Illumb\Database\Eloquent\Relations\HasOneOrMany::save()必须为
Lightlight\Database\Eloquent\Model的一个实例
问题是UserMeta::findOrNew(['user\u id'=>$id])
返回数组而不是对象。。。这很奇怪。。而User::findOrNew($id)
本身返回和对象。。。。我猜这是因为我的条件(这是两个查询之间唯一的区别)
现在我必须做一些像这样的事情
$meta = UserMeta::findOrNew(['user_id'=>$id]);
if(is_array($meta)) {
$user->meta()->save($meta[0]);
} else {
$user->meta()->save($meta);
}
我不喜欢,而且看起来不对 也许你应该使用FirstOrCreate而不是findOrNew。也许你应该使用FirstOrCreate而不是findOrNew。函数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\Database\Eloquent\Builder.php的实现:
public function findOrNew($id, $columns = ['*'])
{
if (! is_null($model = $this->find($id, $columns))) {
return $model;
}
return $this->model->newInstance();
}
如您所见,第一个参数不适用于列
如果您查看了$this->find($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()的结果,这是一个集合。函数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\Database\Eloquent\Builder.php的实现:
public function findOrNew($id, $columns = ['*'])
{
if (! is_null($model = $this->find($id, $columns))) {
return $model;
}
return $this->model->newInstance();
}
如您所见,第一个参数不适用于列
如果您查看了$this->find($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()的结果,这是一个集合。也许
UserMeta
有多行具有相同的user\u id
@jonju不,这是一个1对1关系,所以数据库不会多次接受相同的user\u id,但这并不是一对一关系
@jonju抱歉,我不明白你在说什么,但正如我在模型中定义的,用户和用户之间有1对1的关系。。。另外,我在数据库中查看了我只有一个用户和一个元可能UserMeta
有多行具有相同的user\u id
@jonju不,这是一个1对1关系,所以数据库不会多次接受同一个用户id,但这不是有一个或多个查看一对一关系。你能显示print\r($meta->->toArray的输出吗())
@jonju抱歉,我不明白你在说什么,但正如我在模型中定义的那样,用户和用户元有1对1的关系……而且我在数据库中查看过,我只有1个用户和1个元Thanx,这将是计划BfindOrNew
同时表现不同。根据OP,它是一对一的关系。它应该是在用户
thanx的情况下,它的工作方式是,计划BfindOrNew
同时表现不同。根据OP,它是一对一的关系。它应该像用户
的情况一样工作,所以我们不能更改findOrNew中的WHERE子句?确切地说,它只按id搜索或者您定义为主键列名的任何内容,我看到了,因此我们无法更改findOrNew中的WHERE子句?确切地说,它只按id或您定义为主键列名的任何内容进行搜索