Php 多表关系
我有4个mysql表,如下所示:Php 多表关系,php,mysql,laravel,laravel-4,eloquent,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表中只有子trim的Makes列表 我在forsale表中有20条记录,我想得到这些汽车的品牌列表 我
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表中只有子trim的Makes列表
我在forsale表中有20条记录,我想得到这些汽车的品牌列表
我使用的是Laravel,因此,如果有人以前使用过eloquent,那么这将非常好您可以使用此查询来回答您提出的第一个问题。不确定这是否完全回答了你的问题
选择*FROM Makes m left join Foresale\u Cars fc on(m.id=fc.id)left join Trims t on(fc.trim\u id=t.id),其中t.trim\u name=“child trim”我假设您已设置好所有车型,例如:
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 }}
...
}
}
编辑:当然,您可以使用原始查询,但使用模型和雄辩的力量更优雅、更有用
有关此主题的更多信息:雄辩的方式:
// Makes that have forsale nested relation
Make::whereHas('models', function ($q) {
$q->whereHas('trims', function ($q) {
$q->has('forsales');
});
})->get(); // returns Eloquent Collection
具有正确关系的模型(hasMany可以替换为hasOne,如果这是某个地方的实际关系):
Makes
和for sale table
@samitha之间的关系是什么,我正在将forsale条目与trim IDI关联如果它没有关联如何从makes k中查询选择k.make_name连接l上的模型l.make_id=k.id连接t上的trims t.model_id=l.id连接s上的forsale_汽车s.trim_id=t.id其中…感谢您的尝试,但缺少模型表,我试图在您的查询中实现它,但没有成功。这不是循环mysql查询吗?
// 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');
}