MySQL与多个表的关系

时间:2014-04-23 16:23:06

标签: php mysql laravel laravel-4 eloquent

我有4个mysql表,如下所示:

 Makes:
 id - make_name

 Models:
 id - model_name - make_id

 Trims:
 id - trim_name - model_id

 Forsale_Cars:
 id - trim_id - year - price

在Makes表中我有~700条记录,所以我的问题是,如何获得一个只在forsale表中有一个子修剪的Makes列表?

我在forsale表中有20条记录,我想获得这些车的制造清单。

我正在使用Laravel,所以如果有人以前使用雄辩的方式取得了成功,那就很棒了

3 个答案:

答案 0 :(得分:1)

雄辩的方式:

// Makes that have forsale nested relation
Make::whereHas('models', function ($q) {
    $q->whereHas('trims', function ($q) {
        $q->has('forsales');
    });
})->get(); // returns Eloquent Collection

具有正确关系的模型(hasMne可以替换为hasOne,如果它的实际关系在某处):

// Make model
public function models()
{
    return $this->hasMany('CarModel');
}

// CarModel (as you can't use Model name)
public function trims()
{
    return $this->hasMany('Trim');
}
public function make()
{
    return $this->belongsTo('Make');
}

// Trim model
public function forsales()
{
    return $this->hasMany('Forsale');
}
public function carModel()
{
    return $this->belongsTo('CarModel');
}

// Forsale model
public function trim()
{
    return $this->belongsTo('Trim');
}

答案 1 :(得分:0)

您可以将此查询用于您提出的第一个问题。不确定这是否完全回答了你的问题。

SELECT * FROM使m左连接Foresale_Cars fc on(m.id = fc.id)left join Trims t on(fc.trim_id = t.id)其中t.trim_name =“child trim”

答案 2 :(得分:0)

我假设您已经设置了所有模型,例如:

class Makes extends Eloquent {
    protected $table = 'makes';

    public function models() {
        return $this->hasMany('Model', 'makes_id');
    }
}

依此类推......(当然,你必须对你的所有模特做这件事)

现在,如果你想把所有的汽车都出售,你只需要链接一些foreach循环:

foreach( $makes->models as $model ) {
    foreach( $model->trims as $trim ) {
           {{ $trim->forsale_cars }}
                ...
    }
}

编辑:是的,你当然可以使用原始查询,但使用模型和雄辩的力量更加优雅和实用......

有关此主题的更多信息:http://laravel.com/docs/eloquent#relationships