gpt4 book ai didi

php - 一张表的多个模型 Laravel

转载 作者:行者123 更新时间:2023-12-05 03:56:33 24 4
gpt4 key购买 nike

我有一个问题。我尝试在 Laravel 5.6 中为一张表创建多个模型。我有一张 table ,例如 Car,为他上课:

class Car extends Model {
$fillable = ['type'];
public function test(){ }
}

因此,字段类型是必需的。例如。模型车可以有多种类型(2-10 ..)。根据类型,我应该在测试函数中运行不同的代码。是的,我可以进行多个 if 构造,但事实并非如此。基于此,我想创建更多将从 Car 扩展的类,并将以匹配每种类型。例如:

class ElectricCar extends Car { $type = 'electric'; } ...
class SolarCar extends Car { $type = 'solar'; } ...

如果我创建这个结构,我会遇到一些问题。

例如 id = 1 的记录是 Electric car。如果调用 Car::find(1) 我会得到什么是的,我将获得 Car 类,但我需要 ElectricCar 类。我看到了https://github.com/Nanigans/single-table-inheritance ,但这不是一个好的解决方案。它违反了 SOLID 规则之一,即我们在创建子类时不必更改父类。那么我们可以根据 SOLID 规则给我什么解决方案呢?

最佳答案

您可以使用作用域实现您概述的内容。

创建一个新文件,类似于 app/Scopes/SolarScope.php 并在里面放入以下代码:

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class SolarScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
$builder->where('type', 'Solar');
}
}

然后,在您的新模型中,例如。 SolarCar.php 您需要指定用于该模型的表:

protected $table = 'cars';

然后您需要通过 boot 函数指示该模型使用作用域。

use App\Scopes\JobScope;

protected static function boot()
{
parent::boot();
static::addGlobalScope(new SolarScope);
// optionally instruct saving default type:
// static::saving(function ($car) {
// $car->type = 'Solar';
// });
}

这将确保无论何时引用 SolarCar,该类型都已经在检索和可选的保存范围内。

关于php - 一张表的多个模型 Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com