首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有一个通过拉勒维尔雄辩

有一个通过拉勒维尔雄辩
EN

Stack Overflow用户
提问于 2014-12-14 05:07:31
回答 4查看 44.2K关注 0票数 30

我有三张桌子garagescarssecurities

证券是那些保证一辆车安全的证券,你可以有一个以上的证券,但是一个单独的证券只能保证一辆车的安全。车库是汽车的所在,证券也是如此。

我想要的是列出所有的证券,知道他的车库的名字。问题是,securities没有包含车库id的列,只有他保存的汽车id,但是car有车库的id。

Laravel雄辩有一种叫做hasManyThrough的方法,但是securities只有通过cars才有一个garage

这是几张桌子:

车库桌:

代码语言:javascript
运行
复制
-----------------------------------
|garage_id|garage_name|garage_size|
-----------------------------------
|        1|   Garage 1|        200|
-----------------------------------
|        2|   Garage 2|        400|
-----------------------------------

汽车桌:

代码语言:javascript
运行
复制
---------------------------
|car_id|car_name|garage_id|
---------------------------
|     1|   Car 1|        1|
---------------------------
|     2|   Car 2|        1|
---------------------------
|     3|   Car 3|        2|
---------------------------

证券表:

代码语言:javascript
运行
复制
----------------------------------
|security_id|security_name|car_id|
----------------------------------
|          1|  Security 1|      1|
----------------------------------
|          2|  Security 2|      1|
----------------------------------
|          3|  Security 3|      2|
----------------------------------
|          4|  Security 4|      3|
----------------------------------

产出必须是:

代码语言:javascript
运行
复制
Security 1 is on Garage 1
Security 2 is on Garage 1
Security 3 is on Garage 1
Security 4 is on Garage 2

我有模特:

代码是列出车库,但我想做类似的,但列出证券(只是为了让您了解结构是如何)。

代码语言:javascript
运行
复制
$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
{
}

再次强调一下:,我想知道与安全保障车相关的车库的名称。

只是为了让人更容易理解,如果我这样做:

代码语言:javascript
运行
复制
$securities = Securities::with(['cars'])->get();

class Securities extends Eloquent
{
    public function cars()
    {
        return $this->hasOne('cars');
    }
}

我将只从garage_id表中获得作为关系的cars。我真正想要的是车库的名字。

代码语言:javascript
运行
复制
[relations:protected] => Array
    (
        [cars] => Cars Object
            (
                ...
                [attributes:protected] => Array
                    (
                        ...
                        [car_name] => Car 1
                        [garage_id] => 1
                        ...
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-14 15:09:32

看起来,您没有正确地关联对象。让我们把它分解一下:

如果一个Garage有很多Car,那么Car属于Garage,那么让我们记住这个想法。

  • Garage有许多Car
  • Car有许多Security
  • Security属于Car
  • Garage通过Car拥有许多Security

在雄辩的你可以继续和鼓掌的关系,它应该工作,考虑到你上面发布的模式。

代码语言:javascript
运行
复制
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');
    }
}

应该是这样的。

编辑:--只要有一条从一个模型到另一个模型的路径,就可以使用这些关系的组合来访问所有这些关系。例如,请查看此文件:

代码语言:javascript
运行
复制
$security = Security::with('car.garage')->first();

将首先检索Security记录并在其上加载Car关系,然后再执行一步,并加载在Security模型下加载的每个Car对象上的所有Garage关系。

您可以使用以下语法访问它们:

代码语言:javascript
运行
复制
$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()等。

票数 46
EN

Stack Overflow用户

发布于 2016-01-20 19:26:51

最近我遇到了一个类似的问题,我做了这样的事情:

代码语言:javascript
运行
复制
class Cars extends Eloquent
{
    public function garage()
    {
        return $this->hasOne('Garages');
    }
}

class Securities extends Eloquent
{
    public function car()
    {
        return $this->hasOne('Cars');
    }

    public function garage()
    {
        return $this->car->garage();
    }
}

这让你的证券有一个车库关系,你可以这样做:

代码语言:javascript
运行
复制
$securities = Securities::with('garage')->get();

foreach($securities as $security)
{
    echo $security->security_name . ' is on ' . $security->garage->garage_name;
}
票数 15
EN

Stack Overflow用户

发布于 2018-11-20 14:31:06

这与你最初的询问有关。

hasOneThrough将以Laravel5.8提供

https://github.com/laravel/framework/pull/26057/files

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27466542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档