我有三张 table garages
, cars
, securities
.
证券是保护一辆车安全的证券,您可以拥有多个安全性,但单一安全性只能保护一辆车的安全。车库是汽车所在的地方,证券也是。
我想要列出所有证券并知道他所在的车库的名称。问题是 securities
没有包含车库 id 的列,只有他保持安全的汽车的 id,但 car 有车库的 id。
Laravel Eloquent 有一个名为 hasManyThrough
的方法, 但是 securities
有一个garage
通过cars
仅限。
这是表格:
车库 table :
-----------------------------------
|garage_id|garage_name|garage_size|
-----------------------------------
| 1| Garage 1| 200|
-----------------------------------
| 2| Garage 2| 400|
-----------------------------------
汽车表:
---------------------------
|car_id|car_name|garage_id|
---------------------------
| 1| Car 1| 1|
---------------------------
| 2| Car 2| 1|
---------------------------
| 3| Car 3| 2|
---------------------------
证券表:
----------------------------------
|security_id|security_name|car_id|
----------------------------------
| 1| Security 1| 1|
----------------------------------
| 2| Security 2| 1|
----------------------------------
| 3| Security 3| 2|
----------------------------------
| 4| Security 4| 3|
----------------------------------
输出必须是:
Security 1 is on Garage 1
Security 2 is on Garage 1
Security 3 is on Garage 1
Security 4 is on Garage 2
我有模型:
代码是列出车库,但我想做类似的但列出证券(只是为了让您了解结构如何)。
$garages = Garages::with(['cars', 'securities'])->get();
$garages->transform(function($garages) {
return array(
'garage_name' => $garage->garage_name,
'count_cars' => $garage->cars->count(),
'count_securities' => $garage->securities->count(),
);
});
class Garages extends Eloquent
{
public function cars()
{
return $this->hasMany('cars');
}
public function securities()
{
return $this->hasMany('securities');
}
}
class Cars extends Eloquent
{
}
class Securities extends Eloquent
{
}
再次强调一下:我希望车库的名称与保安所保护的汽车相关。
只是为了让它更容易理解,如果我这样做:
$securities = Securities::with(['cars'])->get();
class Securities extends Eloquent
{
public function cars()
{
return $this->hasOne('cars');
}
}
我只会得到 garage_id
来自 cars
表作为关系。我真正想要的是车库的名字。
[relations:protected] => Array
(
[cars] => Cars Object
(
...
[attributes:protected] => Array
(
...
[car_name] => Car 1
[garage_id] => 1
...
最佳答案
您似乎没有正确关联对象。让我们分解一下:
如果 Garage
有很多Car
然后是 Car
属于 Garage
, 让我们继续考虑这个想法。
-
Garage
有很多Car
-
Car
有很多Security
-
Security
属于Car
-
Garage
有很多Security
通过Car
在 Eloquent 中,您可以直接将这些关系加入其中,考虑到您在上面发布的架构,它应该可以工作。
class Garage extends Eloquent
{
public function cars()
{
return $this->hasMany('cars');
}
public function securities()
{
return $this->hasManyThrough('Security', 'Car');
}
}
class Car extends Eloquent
{
public function securities()
{
return $this->hasMany('Security');
}
// ADDED IN SECOND EDIT
public function garage()
{
return $this->belongsTo('Garage');
}
}
class Security extends Eloquent
{
public function car()
{
return $this->belongsTo('Car');
}
}
应该就是这样。
编辑:您可以从任何模型访问所有这些关系,只要您可以使用这些关系的组合从一个模型绘制到另一个模型的路径。看看这个例子:
$security = Security::with('car.garage')->first();
将首先检索 Security
记录并加载Car
关系就可以了,然后它再走一步并加载所有Garage
每个 Car
上的关系在 Security
下加载的对象型号。
您可以使用以下语法访问它们:
$security->car->garage->id
// Other examples
$garage = Garage::with('cars.securities')->first();
foreach($garage->cars as $car)
{
foreach($cars->securities as $security)
{
echo "Car {$car->id} has {$security->id} assigned to it";
}
}
此外,请注意关系对象是 Collection
的一个实例。所以你有所有花哨的方法,如->each()
, ->count()
, ->map()
可用。
关于php - 有一个通过 Laravel Eloquent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27466542/