簡體   English   中英

Laravel 4雄辯的模型鏈接了附加的where子句

[英]Laravel 4 eloquent models chaining additional where clauses

我有以下代碼(成員只是一個標准的口才模型)

$members = new Member;
$members->where('user_id', '=', 5);
$_members = $members->get();

上一次查詢運行會產生“ SELECT * from members ”,所以它似乎忽略了我的where子句,我在這里做什么錯的?

順便說一句,我知道我可以做$members = new Member::where(...)等...,但是我將在循環中添加where子句,以便對數據庫結果進行過濾。

更新

解決此問題的唯一方法似乎是添加一個可以捕獲所有初始化的位置,例如:

 $members = Member::where('member_id', '<>', 0);
 $members->where('user_id', '=', 5);
 $_members = $members->get();

但這似乎是一個很大的漏洞。 我沒有嘗試做任何復雜的事情,所以我不能成為唯一遇到此問題的人嗎?

已修正

對於任何在這里跌跌撞撞的人,我已使用以下方法修復了此問題:

$members =  Member::query();
$members->where('user_id', '=', 5);
$_members = $members->get();

不知道這是否是正確的方法,但是它對我有用,並且看起來並不像hack。

我不相信Eloquent這樣的作品。

嘗試這個...

$members = new Member;
$members = $members->where('user_id', '=', 5);
$members = $members->get();

有一種更好的方法可以使用查詢范圍來實現您所需要的功能。 這是您需要做的。

在您的Member.php模型中執行以下操作:

public function scopeMembers($query, $condition1, $condition2)
{
    if ( ! empty($condition1))
    {
        $query = $query->where('column1', $condition1);
    }

    if ( ! empty($condition2))
    {
        // Use if ( ! empty($condition2[0]) { $query->whereIn('column2', $condition2); } if you are exploding the input in the controller.
        $query = $query->where('column2', $condition2);
    }
}

在您的控制器中執行以下操作:

protected $member;

public function __construct(Member $member)
{
    $this->member = $member;
}

public function getMembers()
{
    $condition1 = Input::get('condition1');
    $condition2 = Input::get('condition2');

    $members = $this->member->members($condition1, $condition2)->paginate(10);

    return View::make('members', compact('members'));
}

這是一個非常基本的示例,可以根據需要進行擴展。 如您所見,您可以根據需要將盡可能多的條件傳遞給查詢范圍。

$query = Member::where('user_id', 5);

if ( $someCondition )
{
    $query->where(....);
}

$members = $query->get();

您不必調用find()而不是get()嗎?

暫無
暫無

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

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