多个表上的MySQL关系

时间:2014-05-30 18:14:54

标签: php mysql sql laravel eloquent

我有以下表格:

 Makes:
 id - make_name

 Models:
 id - model_name - make_id

 Trims:
 id - trim_name - model_id

 Forsale_Cars:
 id - trim_id - year - price

我的问题是,如果用户选择(制作ID),我该如何返回该制作下列出的所有裁剪并存在于Forsale_Cars表中?

5 个答案:

答案 0 :(得分:1)

在Eloquent中,这对你有用:

$make = Make::find($selectedId);
$trims = $make->trims()->has('forsales')->get();
// returns collection of Trim models that have related row in foresale_cars

// to also load the forsales models you can then do this (load on the collection):
$trims->load('forsales');
// or instead in one chain
$trims = $make->trims()->has('forsales')->with('forsales')->get();

您需要Make型号上的此关系:

public function trims()
{
  return $this->hasManyThrough('Trim', 'Model');
}

其他关系,例如您之前的问题MySQL relation with multiple tables

答案 1 :(得分:0)

您想要显示修剪。所以选择修剪。您只想显示Forsale_Cars中存在的修剪,因此请使用EXISTS(或IN,如果您认为是集合)。您只想显示某些品牌的裁剪。再次使用EXISTS(或IN),因为您可以这样说:其中存在具有指定make的模型(或者模型在该模型的集合中)。

希望这会有所帮助。否则回来你得到的,所以我们可以给你更多的建议。

答案 2 :(得分:0)

在所有表之间进行连接,如下所示,它将为您提供匹配的行

select m.id as makeId,
t.id as trimid,
t.trim_name,
t.model_id
from Makes m
inner join Models mo 
on m.id = mo.make_id
inner join Trims t
on t.model_id = mo.id
inner join Forsale_Cars fc
on fc.trim_id = t.id

答案 3 :(得分:0)

你想要

SELECT
    *
FROM
    Trims t
INNER JOIN             -- it will get us only existing 
    Models m
ON
    t.model_id = m.id
INNER JOIN
    Forsale_Cars fc
ON
    t.id = fc.trim_id
WHERE
    m.make_id = <user input>

通过使用INNER JOIN,您将只获得Forsale_Cars中列出的现有修剪。

答案 4 :(得分:-1)

如何仅使用您提供的架构信息(表,属性)来实现此目的并不是很清楚。如果您向我们提供连接表的数据模型,这将更容易。参见:

http://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model

推测Models(make_id)是引用Trims和Forsale_Cars中的属性的外键。您应该能够加入这些表并选择您要查找的内容。