在updateOrInsert调用中是否可以同时满足两个条件?

时间:2019-05-13 00:36:32

标签: php laravel laravel-5 eloquent

通过阅读Laravel Documentation,我知道updateOrInsert接受两个参数,第一个是条件数组。对该数组进行一次比较,而不是一次比较-即,给定数组['name' => 'John', 'email' => 'contact@example.com']时,它将首先用name == 'John'检查一行,然后,如果找不到,它会寻找带有email == 'contact@example.com'的行。

我想同时满足两个条件-即,只有具有name == 'John' AND email == 'contact@example.com'的行才会更新

是否可以通过updateOrInsert函数执行此操作,还是我需要使用if语句和额外的调用来检查这两种情况?

2 个答案:

答案 0 :(得分:3)

是的,您可以那样做,已经在文档中了

DB::table('users')
    ->updateOrInsert(
        ['email' => 'john@example.com', 'name' => 'John'],
        ['votes' => '2']
    );

它将检查email == 'john@example.com'name == 'john',然后更新votes=2

答案 1 :(得分:0)

updateOrInsert的行为应与您希望的一样。它采用的第一个参数是条件的连接数组。第二个参数是一个数组,用于与条件合并并使用其更新任何匹配的记录。

    /**
     * Insert or update a record matching the attributes, and fill it with values.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return bool
     */
    public function updateOrInsert(array $attributes, array $values = [])
    {
        if (! $this->where($attributes)->exists()) {
            return $this->insert(array_merge($attributes, $values));
        }
        if (empty($values)) {
            return true;
        }
        return (bool) $this->take(1)->update($values);
    }

来自https://github.com/laravel/framework/blob/bc31b3b22c44fcc797ad4e5a6f95f5bccdd63acc/src/Illuminate/Database/Query/Builder.php#L2699的代码