gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:51:00 25 4
gpt4 key购买 nike

问题

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

错误

Column not found: 1054 Unknown column 'day' in 'field list'

我的代码

我正在尝试将一个 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();
}

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

//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: [] 属性,以便我仍然可以在观察者中使用它?

最佳答案

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

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

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

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

关于php - Laravel - 使用 model::create() 时忽略不存在的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53118300/

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