簡體   English   中英

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

[英]Using a Laravel model method in an Eloquent query

這是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情況下搜索(和排序) name 也許存儲連接的名稱沒什么大不了的,我應該這樣做,但我也在努力學習。

這意味着您應該在數據庫級別連接列值。 這意味着您可以使用CONCATwhereRaw子句:

$query->whereRaw('CONCAT(name_first, " ", name_last) LIKE ?', ['%' . Request::input('name') . '%']);

或者,如果您希望將全名選擇為結果的一部分,則可以選擇在select和use having而不是在where可以使用列別名:

$query->select('*', DB::raw('CONCAT(name_first, " ", name_last) as name'))
      ->having('name', 'LIKE', '%' . Request::input('name') . '%');

不是最緊湊的解決方案,但涉及MySQL功能的東西需要一些原始SQL來與Query Builder一起使用。

我同意Bogdan的觀點,在第一個或者最后一個名字中都有空格的問題使得對各個列的查詢很困難,所以這可能是要走的路。 通過將其定義為自定義范圍,可以增加代碼重用: https//laravel.com/docs/5.2/eloquent#local-scopes

// class User
public function scopeOfFullNameLike($query, $fullName)
{
    return $query->whereRaw('CONCAT(name_first, " ", name_last) LIKE "%?%"', [$fullName]);
}
// ...
User::ofFullNameLike('john doe')->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM