这适用于Laravel 5.2。我的用户模型中有一个如下定义的方法:
public function name()
{
return "$this->name_first $this->name_last";
}
我正在试图弄清楚如何使用它作为查询的一部分,但似乎有一个明显的原因是不可能的:数据库对该方法一无所知,这很有道理。然而,我想要实现的概念在某些情境中是有道理的,所以我试图看看是否有办法在Eloquent中自然地完成它。
这不起作用,但它代表了我正在努力实现的目标:
public function index(Request $request)
{
$query = new User();
if(Request::has('name')) {
$query = $query->where('name', 'LIKE', '%' . Request::input('name') . '%');
}
return $query->get();
}
简而言之,数据库只知道name_first
和name_last
,但我希望能够在name
上搜索(和排序)而不存储它。也许存储连接的名称没什么大不了的,我应该这样做,但我也在努力学习。
答案 0 :(得分:3)
这意味着您应该在数据库级别连接列值。这意味着您可以使用CONCAT
和whereRaw
子句:
$query->whereRaw('CONCAT(name_first, " ", name_last) LIKE ?', ['%' . Request::input('name') . '%']);
或者,如果您希望选择全名作为结果的一部分,您可以在select中连接并使用having
代替where
以便能够使用列别名:
$query->select('*', DB::raw('CONCAT(name_first, " ", name_last) as name'))
->having('name', 'LIKE', '%' . Request::input('name') . '%');
不是最紧凑的解决方案,但涉及MySQL功能的东西需要一些原始SQL来与Query Builder一起使用。
答案 1 :(得分:3)
我同意Bogdan的观点,在第一个或者最后一个名字中都有空格的问题使得对各个列的查询很困难,所以这可能是要走的路。通过将其定义为自定义范围,可以增加代码重用: https://laravel.com/docs/5.2/eloquent#local-scopes
Sub PickANumber()
Dim Valid As Boolean
Dim Data, Answer As String
While Valid = False
Data = InputBox("Enter number between 1 and 4")
If IsNumeric(Data) And Data >= 1 And Data <= 4 Then
Valid = True
Else
Valid = False
Data = MsgBox("Please input a valid number.", vbRetryCancel)
If Data = vbCancel Then Exit Sub
End If
Wend
Select Case Data
Case 1
Answer = "Good"
Case 2
Answer = "Good again"
Case 3
Answer = "Not too good"
Case 4
Answer = "Terrible"
End Select
MsgBox Answer
End Sub