【问题标题】:Laravel only delete a model if no related model existLaravel 仅在不存在相关模型时删除模型
【发布时间】:2015-12-08 07:37:42
【问题描述】:

假设我有一个名为“制造商”的模型,并且该模型与另一个模型“车辆”具有一对多的关系。现在我不想让用户删除制造商,如果有任何与此模型相关的车辆。

//In Manufacturer model

public function vehicles()
{
    return $this->hasMany('Vehicle');
}

在存储库/控制器中,我有另一种检查方法。

public function checkAssociatedVehicles($id)
{
    return Manufacturer::with('vehicles')->find($id)->toJson();
}

这会输出所有相关车辆的制造商数据。但这效率不高,所以我只想检查是否只有一辆车然后不要删除制造商。

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    我相信您会想使用has 方法来确保制造商有一些车辆。

    $manufacture = Manufacturer::has('vehicles')->find($id);
    

    那么你只想确定!is_null($manufacture)

    【讨论】:

    • has() 我们用于急切加载,这并不是这里真正需要发生的事情。相反,我只计算车辆而不取它们。假设 $manufacturer 模型已经被获取并且 vehicles 关系方法已经被添加到模型中:$manufacturer->vehicles()->count()
    【解决方案2】:

    由于您的制造商模型中有一个vehicles() 方法,您可以这样做:

    在删除之前使用whereDoesntHave方法过滤所有没有车辆的制造商:

    Manufacturer::whereDoesntHave('vehicles')->get();
    

    来自API

    使用 where 子句向查询添加关系计数条件。

    【讨论】:

      【解决方案3】:

      您可以像这样返回车辆总数:

        return [
            'count' => Manufacturer::with('vehicles')->find($id)->count()
        ];
      

      现在您可以检查计数了。

      【讨论】:

        【解决方案4】:

        这将返回关于制造商是否有车辆的布尔值。

        return (Manufacturer::with([
            'vehicles'=> function($query){
                return $query->limit(1);
            }])->find($id)->vehicles);
        

        您可以在车辆上添加外键和主键,以减少查询的列数,以考虑性能问题。

        return $query->limit(1)->select('id','manufacturer_id');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 2014-02-12
          • 2014-06-09
          • 2020-11-18
          • 2014-07-17
          相关资源
          最近更新 更多