【问题标题】:Laravel - Ignoring fields that don't exist when using model::create()Laravel - 使用 model::create() 时忽略不存在的字段
【发布时间】:2018-11-02 12:05:16
【问题描述】:

问题

当 Eloquent 的 create 方法中存在的字段或为数据库播种时,我无法让 Laravel 忽略数据库中不存在的字段。在下面的示例中,Event 表中不存在“day”字段。但是,我需要它存在于数组中,这样我就可以在 EventObserver.php 中使用它,以便在创建 $event 的同时创建 $event->day。我意识到我可以在它自己的工厂中创建Day,我只是想知道这是否可行甚至是可取的。

错误

未找到列:1054“字段列表”中的未知列“日”

我的代码

我正在尝试将 Observer 方法附加到我的 Event 模型中,该模型侦听 created 方法,以便我可以为每个关系创建一个新对象。在我的 EventObserver 中,我有以下内容;

public function created(Event $event)
{

//get all attributes
$data = $event->getAttributes();

# fill any related models
$event->day->fill($data['day']);

# save event
$event->push();
}

在我的事件工厂中,我有这个;

//EventFactory.php
$factory->define(App\Event::class, function (Faker $faker) {
    return [
        "name"                        => "A Test Event",
        "description"                 => $faker->paragraphs(3, true),
        "event_start_date"            => today(),
        "event_opening_date"          => today(),
        "event_closing_date"          => tomorrow(),
        "user_id"                     => 1,
        "banner_id"                   => 1,
        "gallery_id"                  => 1,
        "related_event_id"            => 1,
        "status"                      => "published",
        "purchase_limit"              => 1000,
        "limit_remaining"             => 1000,
        "delivery_method"             => "collection",
        "merchandise_delivery_method" => "collection",
        "day"                         => [
            "event_id"        => 1,
            "name"            => "Created with observer",
            "date"            => today(),
            "ticket_limit"    => 1000,
            "limit_remaining" => 1000
        ]
    ];
});

总结

如何让 Laravel 在创建事件时忽略 day: [] 属性,以便我仍然可以在观察者中使用它?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    Eloquent 不会存储表中存在哪些列。因此,它会尝试将您传递到 create 方法中的任何字段插入,只要它们没有被批量分配保护阻止。

    避免这种情况的一种方法是在模型的 $fillable 属性中显式声明所有字段。模型上的批量分配保护将过滤掉所有不存在于 $fillable 中的字段。这将阻止您的观察者正常工作,因为模型属性中不存在“day”。

    在您的情况下,您永远不应该在 EventFactory 中创建“日”索引。为什么要为模型创建工厂中不存在的索引?有更好的方法来创建相关数据,例如为相关模型创建和使用不同的工厂。

    您还可以创建自己的方法来创建和填充模型及相关数据。我不会尝试覆盖默认的创建功能。

    【讨论】:

    • 我想以与事件相同的形式创建日期并附加它们。奇怪的是,我设置了 filllable 属性,但仍然得到错误
    • 为什么需要在 EventFactory 中设置日期索引?展示您如何创建事件。工厂创建方法可能会绕过批量分配保护。
    • 我不一定要在工厂里做,但我在 create() 里做 好的,稍后会更新。
    • 你了解模型工厂的概念吗?它用于生成随机数据以播种模型的表。事件表中不存在“day”,因此它不属于。为代表一天的表/模型创建一个新工厂,并在附加日期时使用该工厂。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多