【问题标题】:Connecting database fields and model attributes in Laravel在 Laravel 中连接数据库字段和模型属性
【发布时间】:2018-06-18 18:46:10
【问题描述】:

我刚刚开始使用 Laravel,并使用 Eloquent 定义了我的 Campaign 表。我有一个Campaign 模型,目前是空的。

我不确定如何向此模型添加属性以表示数据库中的字段 - 或者即使我应该这样做。 Laravel 文档在模型上似乎很薄弱,搜索不断将我引向访问器和修改器。

如果我的campaigns 表中有一个名为platform_type 的数据库字段,如何将PlatformType 模型属性链接到该字段?

澄清一下:

这不是关于关系的问题 - 到目前为止,我的解决方案中只有一个实体。

platform_type 是我的campaigns 表中的一个字段,因为它是一个活动的属性 - 我想知道如何在我的模型中表示它。

【问题讨论】:

    标签: php laravel eloquent laravel-eloquent


    【解决方案1】:

    您需要定义关系。在PlatformType 模型中:

    public function campaigns()
    {
        return $this->hasMany(Campaign::class, 'platform_type');
    }
    

    Campaign 模型中:

    public function platformType()
    {
        return $this->belongsTo(PlatformType::class, 'platform_type');
    }
    

    您还需要将campaign 表重命名为campaigns。或者您应该将其添加到模型中以便能够使用自定义名称:

    protected $table = 'campaign';
    

    此时,这些表将被连接并且关系将起作用。不过建议add foreign key constraints

    【讨论】:

    • 感谢@Alexey,但目前只有一个表格和模型,并且不需要关系-platform_type 是一个活动字段(确实有一个's',这是我的错字)。我的问题是关于在该表实体的模型中表示表上的字段。
    • @AdamHopkinson 如果您打算使用mass assignment feature,除了添加$fillable 数组之外,您无需执行任何操作
    【解决方案2】:

    该模型有一个内部数组,用于存储给定行的属性(它称为$attributes,如果您在源代码中查找它们,则由$original 复制)。它被复制的原因是,当您调用save() 时,它只会在您实际更改原始文件时进行保存。

    您可以通过$modelInstance->getAttribute("platform_type")$modelInstance->platform_type 访问所述属性,这将调用神奇的__get 方法,然后又调用getAttribute

    所以在你的情况下你可以有:

    $campaign = Campaign::find($id);
    echo $campaign->platform_type;
    

    ORM 将自动创建相关的 SQL 查询,并用它找到的行的属性填充模型实例。

    【讨论】:

    • 很有趣,谢谢。我也一直在研究 Symfony 和 Doctrine,其中模型定义用于定义 db 表,因此所有字段都在模型中进行控制。没有这个感觉很奇怪,但我可以看到实用程序。
    • Laravel 有 schema builder and uses migrations,这是一种不同的方法。我想如果您的表格更流畅并且更频繁地更改,那么教义可能会更好。
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多