Laravel - 使用 model::create() 时忽略不存在的字段

Lew*_*wis 3 php laravel eloquent

问题

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

错误

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

我的代码

我正在尝试将一个 Observer 方法附加到我的事件模型,该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();
}
Run Code Online (Sandbox Code Playgroud)

在我的 Event Factory 中,我有这个;

//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
        ]
    ];
});
Run Code Online (Sandbox Code Playgroud)

概括

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

Dev*_*von 5

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

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

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

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