使用Laravel的Eloquent ORM过滤查询

时间:2014-08-12 06:59:38

标签: laravel-4 eloquent

我已经定义了这样的Eloquent模型:

class Order extends Eloquent {
    public function station() {
        return $this->belongsTo('Station');
    }
}

class Station extends Eloquent {
    public function client() {
        return $this->belongsTo('Client');
    }

    public function orders() {
        return $this->hasMany('Order');
    }
}

class Client extends Eloquent {
    public function stations() {
        return $this->hasMany('Station');
    }
}

现在我想做一个与所有这些相关的查询,但是我很难弄清楚如何以雄辩的方式去做。这是我想要返回的查询的SQL:

SELECT o.id, c.name AS cname, s.name AS sname, o.created, o.due, o.name, o.comments, o.points
FROM orders o
JOIN station s ON o.station_id = s.id
JOIN client c ON c.id = s.client_id
WHERE s.id IN (
    SELECT id FROM orders WHERE complete
)

我对如何做Laravel / Eloquent方式感到困惑。

2 个答案:

答案 0 :(得分:0)

嗯,这里有几种方法可以处理它。

  1. 执行整个原始查询
  2. 制作雄辩的查询
  3. 要获得对查询的更多控制,我会得到第一点

    这可以通过直接执行语句来实现

    DB::select(DB::raw($your_sql_here));

    或通过使用查询构造函数构建。

    第二种方式涉及对关系如何运作的一些研究。 最终查询可能看起来像这样(不完全相同,但会给你一个提示):

    Order::with('station.client')->whereIn('station.id', DB::raw('SELECT id FROM orders WHERE complete'))
    

    希望这会有所帮助。还有一个很棒的cheet-sheet 可以为您提供比DB和Model对象更多的方法。

答案 1 :(得分:0)

您应该可以使用Eager Loading执行此操作:

$orders = Order::where('complete', $complete)->with('station.client')->get();

然后你可以遍历每个订单:

foreach ($orders as $order) {

    echo e("The order ID is $order->id <br>");
    echo e("The station ID is {$order->station->id} <br>");
    echo e("The client ID is {$order->station->client->id} <br>");
}

希望有所帮助。