php - 有一个通过 Laravel Eloquent

标签 php laravel laravel-4 eloquent laravel-5

我有三张 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/

相关文章:

PHP MySQL 查询忽略 AND 语句

laravel - 在 laravel 查询构建器上添加过滤功能

php - 在 Laravel 4.2 中创建 SQL 查询

many-to-many - 多选编辑表单选定值

database - Laravel 4 中的外键跨数据库错误

PHP 警告 : PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20100525/php_curl.dll'

php - 如何授权 cron 作业 php 文件访问 Xero?

laravel - 从 5.1 升级到 Laravel 5.4.0

php - 错误 : git was not found - installing laravel with composer windows

php - 警告:mysqli_query():无法在第6行的C:\…\localweb\test-pagini.php中获取mysqli