在Laravel 4中急切加载约束的问题 - 一种解决方法?

时间:2013-07-07 20:46:09

标签: laravel laravel-4 eloquent

我有2个表,地方和用户。地方可以有很多用户。

// in Place.php
public function users()
{
    return $this->hasMany('User');
}

//in User.php
public function place()
{
    return $this->belongsTo('Place');
}

我正在尝试仅通过静态方法Place :: locationsWithPeople()获取至少有一个活动且已启用用户关联的位置。

public static function locationsWithPeople()
{
     return Place::with(array('users' => function($query)
        {
            $query->where('enabled', '=', 1)->where('active', '=', 1);
        }))->get();
}

这会产生一个HTTP 500.删除两个没有帮助。

这有效,但当然它不包含两个:

    return Place::has('users')->get();

任何人都可以提供帮助?这看起来完全类似于Laravel文档中的例子。

3 个答案:

答案 0 :(得分:0)

这适合我。

$place = new Place;

$array = $place->with(array('users' => function($query)
{
    $query->where('enabled', 1)->where('active', 1);
}))->get();

var_dump($array->toArray());

也许是因为你试图静态使用非静态方法?

答案 1 :(得分:0)

似乎问题是由过多的资源消耗引起的,导致页面在资源耗尽时达到HTTP500。通过连接语句重写它来修复。

答案 2 :(得分:0)

你能试试吗?

return Place::with(array('users' => function($query)
        {
            $query->where('enabled', '=', 1)->where('active', '=', 1);
        }))->hasWith('users')->get();

方法hasWith是我写的范围。您可以从http://paste.laravel.com/13jb获取scopeHasWith()。这将与has()方法相同,但在将WHERE附加到查询构建器之前将调用eagerload闭包。

我认为这可以解决你过多使用资源的问题,你可以通过eagerload关闭来解决它们。我有同样的问题,我想查询关系,但它发送所有匹配WHEREIN的记录,并导致内存问题。