查询的条件关联

时间:2015-02-02 23:42:39

标签: laravel eloquent

我有两种模式:

class Table extends Eloquent {
    protected $table = 'tables';

    public function sessions() {
        return $this->hasMany('Sessions');
    }
}

class Sessions extends \Eloquent {
    protected $table = 'sessions';

    public function table() {
        return $this->belongsTo('Table');
    }
}

(我将其称为Sessions而不是Session,因为Laravel难以混淆类)。

表是指实际的餐桌,会话只是某人或某个使用它的组 所以,我来到桌子,坐下来,开始一个会议,吃饭,付钱,关闭会议和离开。然后你来坐在同一张桌子上,这对应一个新的会议。

现在,这就是我查询表格的方式:

$table = Table::where('id', '=', $id)->with('sessions')->first();

然而,我的表附带了所有相关的会话。我该如何进行查询:

- 如果表的会话已打开,则返回表+单个会话(Session.closed_at ='0000-00-00 00:00:00')。
- 如果没有打开的会话,则仅返回没有关联记录的表。

我应该如何在我的Controller和我的模型中构建这个相同的查询(例如Table :: getWithSessions($ id))。

感谢。

附录: 很快,我将有一个非常复杂的关系: 一张桌子有很多会话(只有一个是重要的,活动的一个),它有很多卡片(每个人都可以获得他们各自的卡片),这些卡片可以有很多订单。订单是卡片和商品之间的连接,指向产品或其中许多产品(例如,具有多种不同啤酒的工具包)。

我很感激有关如何与雄辩建立这种关系的任何见解,并让所有人都能很好地玩(例如能够查询表并获得与当前会话相关的所有卡的所有订单)。

1 个答案:

答案 0 :(得分:0)

您可以使用with()中的闭包来定义条件,从而将模型过滤为急切加载。您也可以使用find()代替where('id',... ->first()

$table = Table::with(['sessions' => function($q){
    $q->where('closed_at', '0000-00-00 00:00:00');
}])->find($id);

注意因为正常关系会返回一个集合,所以它仍然会返回一个集合。因此,在访问会话时,您需要使用:$table->sessions->first()来获取当前会话。


要获取没有开放会话的表格,只需使用whereDoesntHave

$tables = Table::whereDoesntHave('sessions', function($q){
    $q->where('closed_at', '0000-00-00 00:00:00');
})->get();

修改

对于Table::getWithSessions($id)之类的通话,您有两种选择。

1。静态方法

创建一个这样的静态方法:

public static function getWithSessions($id){
    return static::with(['sessions' => function($q){
        $q->where('closed_at', '0000-00-00 00:00:00');
    }])->find($id);
}

2。使用scopes

使用范围,您可以执行以下操作:

Table::withOpenSessions()->find($id);

这是范围方法:

public function scopeWithOpenSessions($query){
    return $query->with(['sessions' => function($q){
        $q->where('closed_at', '0000-00-00 00:00:00');
    }]);
}