2014-02-12 64 views
1

我有以下代码(成员仅仅是一个标准的雄辩模型)Laravel 4雄辩车型串联额外的where子句

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

最后运行的查询产生“SELECT * from members”,所以它似乎忽略了我的where子句,我在这里做错了什么?

顺便说一句,我知道我可以做$members = new Member::where(...) etc ...但我将在循环中添加where子句,以创建数据库结果的筛选。

UPDATE

解决这个问题的唯一方法似乎是添加一个地方,将捕获所有的初始化,如:

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

但这似乎相当黑客攻击的一位。我不想做任何复杂的事情,所以我不能成为唯一有这个问题的人?

使用MAYBE

固定的人谁在这里偶然发现我有固定的:

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

不知道这是正确的做法,但我的作品并没有出现像黑客。

+2

工作示例和非工作示例之间唯一的区别在于'Member'上的第一个调用是静态的。您的修复确保“Member”上的第一个调用是静态调用。所以,也许你应该看看来源并找出原因。 –

回答

6

我不相信雄辩就是这样的。

尝试......

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

对不起,我不能看到你放的东西和我原来的东西之间的区别? – NaN

+3

*有*不同 - 调用输出到' - > where()'被重新设置为$ members变量。问题是如果最初的$ members是Builder的一个实例,你的代码就可以工作。但是当它发生时它就是模型(好的成员)的一个实例,所以当你调用'where'时它必须首先返回一个Builder。然后,您可以在不设置变量的情况下进一步调用“where”。 – alexrussell

+0

而你的“固定的可能”部分可以证明这一点 - 你可以通过调用Model :: query()来开始构建Builder的实例,然后构建它,而无需重新设置任何变量。 – alexrussell

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

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

$members = $query->get(); 
+0

谢谢约瑟夫,但我将需要添加更多where子句取决于用户选择什么,所以不能调用get(),直到最后 – NaN

+0

这样做可行但是如果没有初始where子句,我不想​​要结果被默认的任何东西过滤? – NaN

+0

这正是我在我的问题减去了if()位。当试图这样做的时候,额外的地方没有得到执行,你能够复制或只是我吗? – NaN

0

难道你要调用 发现(中) 代替 的get() ?

+0

使用find()不需要传递其他参数,如记录的ID?这会使搜索无关 – NaN

+0

正确:绝对找不到。没问题。 – alexrussell

1

有一种更好的方法来实现,你需要在这里使用query scopes什么。这是你需要做的。

在你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')); 
} 

这是可以根据您的需要进一步扩展一个非常基本的例子。正如您所看到的,您可以根据需要向查询范围传递尽可能多的条件。

+0

这很棒,即时通讯新的laravel,似乎相当多学习,我没有遇到查询范围之前。我在不知道最佳实践的情况下苦苦挣扎,因此您的建议非常有帮助!谢谢 – NaN