【问题标题】:Laravel 5.5. Many-to-Many. Receive the latest instance拉拉维尔 5.5。多对多。接收最新实例
【发布时间】:2018-06-25 08:10:12
【问题描述】:

我有这样的模型(多对多)

class Driver
{
    public function cars()
    {
       return $this->belongsToMany(Car::class);
    }
}
class Car
{
    public function drivers()
    {
        return $this->belongsToMany(Driver::class);
    }
}

我的车有activated_at 列,可以是null

如何在特定停车场检索每个司机最近激活的汽车?

类似的东西

Parking::find(2)->drivers()->lastActivatedCars...?

【问题讨论】:

  • 您想要一份所有驾驶员的列表,其中包含他们最后激活的汽车吗?或所有驾驶员中最后激活的汽车
  • 是的,我想要一份具有他们上次激活的汽车属性的所有司机的列表
  • 没有激活汽车的司机怎么办?是否应该将它们包含在结果中?

标签: laravel eloquent many-to-many laravel-5.5


【解决方案1】:

您可以为汽车创建一个范围。

// Car.php
public function scopeActivated($query)
{
    return $query->whereNotNull('activated_at')->orderBy('activated_at', 'DESC');
}

然后在你的 Driver.php 中:

// Driver.php

public function latestActivatedCar()
{
    return $this->cars()->activated()->first();
}

那么你可以:

$latest = $driver->latestActivatedCar();

或者你可以创建一个关系,这样你就可以预先加载。

// Driver.php

public function latestActivatedCar()
{
    return $this->belongsToMany(Car::class)
                ->whereNotNull('activated_at')
                ->orderBy('activated_at', 'DESC')
                ->limit(1);
}

那么你可以:

$drivers = Parking::find(2)->drivers;
$drivers->load('latestActivatedCar');

【讨论】:

    【解决方案2】:

    我希望这会有所帮助:

    Parking::with(['drivers' => function ($driverQuery) {
        $driverQuery->with(['cars' => function ($carsQuery) {
            $carsQuery->orderBy('activated', 'desc')
                ->limit(1);
        }]);
    }])->find(2);

    【讨论】:

      猜你喜欢
      • 2018-05-26
      • 2018-02-13
      • 2015-04-13
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      相关资源
      最近更新 更多