Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当条件不在id上时,findOrNew返回数组而不是对象_Php_Laravel_Laravel 5.2 - Fatal编程技术网

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,这将是计划B
findOrNew
同时表现不同。根据OP,它是一对一的关系。它应该是在
用户
thanx的情况下,它的工作方式是,计划B
findOrNew
同时表现不同。根据OP,它是一对一的关系。它应该像
用户
的情况一样工作,所以我们不能更改findOrNew中的WHERE子句?确切地说,它只按id搜索或者您定义为主键列名的任何内容,我看到了,因此我们无法更改findOrNew中的WHERE子句?确切地说,它只按id或您定义为主键列名的任何内容进行搜索