【问题标题】:Laravel - Single Model for Multiple TablesLaravel - 多表的单一模型
【发布时间】:2018-01-19 11:57:06
【问题描述】:

我想为多个表使用一个模型文件。

为什么???

所有表的表结构都相同

我有几列要存储为 JSON 数组,我想使用 Laravel 内置的 Json 序列化而不是手动序列化数组。

我已经在 laracast 博客上读到,这在 Laravel 中是不可能的,但有没有其他方法可以实现。

提前致谢!!!

【问题讨论】:

  • 据我所知,这是不可能的,因为表或模型都是独立的实体。可能现在您的表结构是相同的,但在不久的将来,它可能会改变。如果您仍然找到解决方案,我建议您不要这样做。
  • 但是模型是非常基本的,不太可能改变,所以对我来说这样做而不是创建多个模型文件是有意义的 @SaadSuri 是否有任何选项可以避免创建多个模型文件...
  • 在模型中你可以定义表(protected $table = 'my_flights';),所以如果你在构造函数中根据传递给模型的一些属性设置这个变量,也许它会起作用,但你必须尝试一下,我从来没有做过。
  • 这应该行得通我觉得,谢谢@Autista_z,我会尝试它,如果它有效,您可以将其发布为答案,我会接受答案...再次感谢...
  • 如果可行,请告诉我,然后我会将其添加为答案 :)

标签: php mysql json laravel laravel-5


【解决方案1】:

您可以只创建一个具有所有模型通用逻辑的基本模型,然后创建从基本模型继承的个人模型。

class Auto extends Model
{
    protected $casts = [
        'details' => 'json',
    ];

    public function getWheelsAttribute()
    {
        return $this->details->wheels;
    }
}

class Car extends Auto
{
    // models your "cars" table
}

class Truck extends Auto
{
    // models your "trucks" table
}

class Bus extends Auto
{
    // models your "buses" table
}

或者,您可以创建具有通用功能的特征并在所有子模型中使用该特征。

trait HasJsonDetails
{
    protected $casts = [
        'details' => 'json',
    ];

    public function getWheelsAttribute()
    {
        return $this->details->wheels;
    }
}

class Car extends Model
{
    // models your "cars" table

    use HasJsonDetails;
}

class Truck extends Model
{
    // models your "trucks" table

    use HasJsonDetails;
}

class Bus extends Model
{
    // models your "buses" table

    use HasJsonDetails;
}

或者,如果表结构确实并且将始终相同,则另一种选择是将所有表合并到一个表中并使用单表继承让多个模型都使用同一个表。

使用此方法,您可以将type 字段添加到您的表中,以告诉您使用哪个类来为单个行建模。它还需要一些自定义,但您可以找到要使用的 STI 包,或关注此论坛主题以获取更多信息:

https://laravel.io/forum/02-17-2014-eloquent-single-table-inheritance

当然,这仍然需要与上述方法之一相结合,以在多个模型之间共享实现逻辑。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2021-10-31
    • 2015-12-15
    相关资源
    最近更新 更多