Laravel使用Eloquent ORM的WHERE查询条件

8
我发现了这个。
$user = User::whereConfirmationCode($confirmation_code)->first();

在Laravel的Eloquent ORM中,你可以像上面那样在where语句中追加表格行名吗?
在看到这个之前,我只会写:
例如:$user = User::where('confirmation_code', '=', $confirmation_code)->first(); 谢谢
2个回答

19

是的,你可以构建动态where语句。 它被解析成简单的where语句。 你也可以像这样构建神奇的查询:

$user = User::whereConfirmationCodeAndIdOrRole(12345, 5, 'admin')->first();

它将会被转化为:

$user = User::where('confirmation_code', '=', 123456, 'and')->where('id', '=', 5, 'or')->where('role', '=', 'admin')->first();

今天我了解到动态where的概念;对于那些好奇的小精灵们,我在文件中找到了魔法秘诀:它从\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php文件的第2108行开始,然后调用dynamicWhere函数,在那里独角兽和彩虹一起欢庆。 - Mysteryos
没有文档,怎么会想到使用这种语法?我的问题也是一样的。如何更多地探索这种方法?我浪费了3个小时才用“在文件中查找”找到了whereConfirmationCode 方法。 - Amit Shah
你可以深入源代码,并调查“魔术”方法。这种魔法是通过__call方法实现的。Laravel有很多类似这样的酷魔法。我建议调查源代码。 - xAoc

2

我可能错了。我不知道魔术查询构建器的设置。

这是一个自定义查询范围

例如:有一个帖子模型,它具有一个查询范围,可以获取所有“状态”为已发布的帖子。

class Post extends Eloquent {
    /**
     * Get all posts with 'status' published
     *
     * @param Illuminate\Database\Query\Builder $query
     * @return Builder $query
     */
     public function scopePublished(Builder $query)
     {
         return $query->where('status', 'published');
     }
}

然后使用它:
 Post::published()->first();

注意:可以通过将参数作为查询构建器之后的参数传递到自定义作用域来传递参数到自定义作用域。

 public function scopeStatus(Builder $query, $status)
 {
     return $query->where('status', $status);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接