Laravel 6:如何将多个 where 子句添加到关系中

Posted

技术标签:

【中文标题】Laravel 6:如何将多个 where 子句添加到关系中【英文标题】:Laravel 6: How to add multiple where caluses into a relationship 【发布时间】:2021-02-08 12:06:58 【问题描述】:

我正在尝试使用关系获取实体用户

$users = $entity->users()->paginate(20);

但现在我想根据发送到 API 的参数运行多个 where 条件,所以如果我这样做

$users = $entity->users();
//$users->where($where_array)
$users->paginate(20);

我出现内存不足错误。它首先吸引所有用户,然后尝试分页(在 where 条件中注释掉),所以我如何将此查询拆分为多行并在最后运行它而不使用 DB 查询

我想要做的示例,但取决于发送的参数而不是固定参数

$user->posts()
    ->where('active', 1)
    ->orWhere('votes', '>=', 100)
    ->get();

所以我检查

if(!empty($request->first_name))
  ->where('first_name', 'like', '%'.$request->first_name.'%')

等等。我试过这个

$where = "";

    $like_parameters = array(
        'first_name', 'last_name', 'email', 'phone'
    );

    foreach ($like_parameters as $parameter)
        if(isset($request->$parameter) &&!empty($request->$parameter))
            $where .= "->where('$request->$parameter', 'like', '%'.$request->$parameter.'%')";
        
    
    
    $users = $entity->users().$where->paginate($per_page);

我得到Call to a member function paginate() on string,所以我想将$where 绑定到查询,但不是作为字符串,而是作为该查询本身的一部分。

【问题讨论】:

【参考方案1】:

只要您没有使用 (get,find ....) 从数据库中获取结果,您就可以控制查询构建器并添加许多“位置”

 $query=  $user->posts()
            ->where('active', 1)
            ->orWhere('votes', '>=', 100);

        if(!empty($request->first_name))
            $query=$query->where('first_name', 'like', '%'.$request->first_name.'%');
            

当您设置所有条件并根据需要构建查询时,您可以获取结果:

        $results=$query->get();

【讨论】:

以上是关于Laravel 6:如何将多个 where 子句添加到关系中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

将 Haversine 公式与 Laravel eloquent 和多个 where 子句一起使用

多个where子句,Laravel

Laravel where 子句在多个 orWhere 子句之后没有返回数据?

Laravel 4:将 where 子句添加到连接条件