一、wherein概述

wherein是Laravel提供的查询构造器之一,用于构建包含某个字段的值得SQL select查询语句。wherein提供了一个便捷的方法来构建一个包含多个选择标准的查询。


// 示例
$users = DB::table('users')
                ->whereIn('id', [1, 2, 3])
                ->get();

上面的例子将返回一个拥有id为1、2、3的user集合。下面通过以下几个方面来详细的介绍wherein在Laravel中的使用。

二、wherein的连贯查询

wherein方法是查询构造器的连贯调用之一,可以和其他方法一起使用来生成更复杂的SQL语句。

首先让我们来看一个简单的例子,这个例子展现了单个wherein方法查询。该例子将返回一个表中在指定参数中的行。


$users = DB::table('users')
                ->whereIn('id', [1, 2, 3])
                ->get();

接下来是一个更复杂的示例,它结合了多个查询构造器函数来生成更复杂的SQL语句:


$users = DB::table('users')
                ->where('name', '=', 'John')
                ->orWhere(function ($query) {
                    $query->whereIn('id', [1, 2, 3])
                          ->where('votes', '>', 100);
                })
                ->get();

在上面的例子中,没有使用多个whereIn方法,而是结合了或where和匿名函数来创建一个更细粒度的查询。whereIn方法由匿名函数包含,并且只有获得超过100票后,其ID才会在结果中得到。

三、wherein的子查询

whereIn可以使用子查询作为主查询标准。尽管这可能会增加查询的复杂性,但在某些情况下,它可能会是更具可读性或更容易维护的方法。以下示例使用了子查询来为users表返回$latestOrders中包含ID的所有用户:


    $latestOrders = DB::table('orders')
                        ->select(DB::raw('MAX(order_date) as date, customer_id'))
                        ->groupBy('customer_id');

    $users = DB::table('users')
                ->whereIn('id', function($query) use($latestOrders){
                    $query->select('customer_id')
                            ->from($latestOrders, 'sub')
                            ->whereRaw('orders.order_date = sub.date');
                })
                ->get();

在上面的例子中,查询更复杂,但是通过使用子查询,生成的查询语句更加定义明确。

四、wherein的附加约束条件

在查询中使用whereIn时,可以附加其他约束条件,以更细粒度地定义查询。例如,下面的示例使用whereIn和where两个过滤器来返回具有关注的标签的活动Event:


$events = DB::table('events')
                ->whereIn('name', ['event1', 'event2', 'event3'])
                ->where(function($query) {
                    $query->where('status', '=', 'published')
                          ->orWhere('age', '>', 35);
                })
                ->get();

在上面的例子中,whereIn用于基本过滤,而where用于附加更细粒度的约束条件。

五、whereIn案例分析

下面我们来分析一下whereIn在实际中的应用案例。

1、案例1:多对多关系的查询

Laravel通过模型对象实现对象关联,其中常用的是一对一,一对多,多对多。在多对多关系中,通常有一个中介表。可以使用whereIn方法实现多对多关系的查询操作。下面我们来学习一个案例。

例如,我们创建了一个事件表和标签表,使用标签与事件之间是多对多的关系。下面演示如何通过whereIn查询关注特定标签的活动事件。


// 事件模型
class Event extends Model
{
    public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }
}
// 请求处理器
public function index(){
    $tagList = [1,2,3];//需要查询的标签id列表

    $query = \App\Event::with('tags');//关联模型,用于预载入标签数据
    foreach($tagList as $tagId){
        $query->whereHas('tags', function($query) use($tagId){
            $query->whereIn('id',[$tagId]);
        });
    }
    $events = $query->orderBy('created_at','desc')->paginate();

    return view('event.index', ['events' => $events]);
}

代码中使用foreach循环对标签列表获得事件,主要是通过whereIn方法获得多个标签携带事件的结果。

2、案例2:whereIn和orderBy组合查询

我们经常需要按照指定值的顺序返回记录列表。在这种情况下,可以使用whereIn和orderBy方法组合查询。例如,下面的查询演示了如何按照顺序列出指定ID的文章。


$posts = DB::table('posts')
                ->whereIn('id', [1, 2, 3])
                ->orderByRaw(DB::raw("FIELD(id,1,3,2)"))
                ->get();

上面的例子中,orderByRaw方法用于定义特定的排序顺序,它使用原生的SQL FIELD函数来根据值列表的位置对结果进行排序。

3、案例3:whereNotIn实现排除查询

有时,您可能需要排除满足特定标准的行,这时就要使用whereNotIn方法了。例如,下面的示例从events表中排除id列表中的行:


$excludedEvents = [1, 2, 3];
$events = DB::table('events')
                ->whereNotIn('id', $excludedEvents)
                ->get();

六、总结

通过上述的介绍,whereIn的使用包括了wherein的连贯查询、其他约束条件的附加以及wherein的子查询等方面,使用丰富,可以满足多种复杂场景下的查询需求。

除此之外,我们还通过whereIn在实际中的应用案例进行了分析与演示,说明了whereIn在实际中的价值和作用。