Laravel 4雄辩的模型链接附加条款

时间:2014-02-12 20:01:32

标签: php laravel laravel-4 eloquent

我有以下代码(成员只是一个标准的Eloquent模型)

$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();

不确定这是否是正确的方法,但它对我有效并且看起来不像黑客。

4 个答案:

答案 0 :(得分:6)

我不相信Eloquent就是这样的。

试试这个......

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

答案 1 :(得分: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'));
}

这是一个非常基本的例子,可以根据您的需要进行扩展。如您所见,您可以将所需的条件传递给查询范围。

答案 2 :(得分:0)

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

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

$members = $query->get();

答案 3 :(得分:0)

你不必打电话吗?     找() 代替     得到() ?