在Eloquent查询中使用Laravel模型方法

时间:2016-03-07 23:52:20

标签: php laravel methods eloquent laravel-5.2

这适用于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_firstname_last,但我希望能够在name上搜索(和排序)而不存储它。也许存储连接的名称没什么大不了的,我应该这样做,但我也在努力学习。

2 个答案:

答案 0 :(得分:3)

这意味着您应该在数据库级别连接列值。这意味着您可以使用CONCATwhereRaw子句:

$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