如何使用Laravel Eloquent根据属性/访问者条件查询对象?

时间:2018-09-05 12:47:40

标签: database laravel eloquent

如果我具有如下所示的accessor属性,请使用文档中的示例:

public function getFullNameAttribute()
{
    return "{$this->first_name} {$this->last_name}"; // both are real columns
}

如何基于计算值运行where?像这样:

$user = User::where('full_name', 'John Doe');

它应与first_nameJohnlast_nameDoe的项目匹配。

有没有办法做到这一点,或者我做错了吗?

更新:我找到了一个类似的问题,询问Laravel 4,它有一个答案,但是它指出在进行查询后才应用过滤,这将非常低效。自Laravel 5以来,此机制是否有任何更新?

2 个答案:

答案 0 :(得分:1)

您可以在CONCAT mysql函数中使用raw where语句:

db.getCollection('test').aggregate([
    //Sort
    {$sort: { datetime: -1 }},
    //Add fields to an array
    {$group: {
        "_id": null,
        "field1": { $push: "$field1" },
        "field2": { $push: "$field2" },
    }},

    //Filter and do not include null values
    {$project: {
        "field1notNull" : {
              $filter: {
               input: "$field1",
               as: "f",
               cond: { $ne: [ "$$f", null ] }
            }
          },
        "field2notNull" : {
              $filter: {
               input: "$field2",
               as: "f",
               cond: { $ne: [ "$$f", null ] }
            }
          }
        }
    },
    //Get the first values of each
    {$project: {
        "_id": null,
        "field1": {$arrayElemAt: ["$field1notNull", 0]},
        "field2": {$arrayElemAt: ["$field2notNull", 0]} 
    }}
])

或仅包含2个位置:

->whereRaw('CONCAT(first_name," ",last_name) = "John Doe"')

答案 1 :(得分:1)

拉法尔·米格达(Rafal Migda)的回答可能是最正确的,但我想出了一种更优雅的方法(或者我应该说雄辩的方法),利用示波器进行我想做的事情。在我的模型中,我输入:

public function scopeFullName($query, $fullName)
{
    return $query->whereRaw('CONCAT(first_name, " ", last_name) = "' . $fullName . '"');
}

这将允许我使用如下查询范围:

$user = User::fullName('John Doe');