如果我具有如下所示的accessor属性,请使用文档中的示例:
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}"; // both are real columns
}
如何基于计算值运行where
?像这样:
$user = User::where('full_name', 'John Doe');
它应与first_name
为John
和last_name
为Doe
的项目匹配。
有没有办法做到这一点,或者我做错了吗?
更新:我找到了一个类似的问题,询问Laravel 4,它有一个答案,但是它指出在进行查询后才应用过滤,这将非常低效。自Laravel 5以来,此机制是否有任何更新?
答案 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');