Laravel - игнорирование полей, которые не существуют при использовании model :: create () - PullRequest
0 голосов
/ 02 ноября 2018

Проблема

Я не могу заставить Laravel игнорировать поля, которые не существуют в базе данных, когда они присутствуют в методе Eloquent create или при заполнении базы данных. В приведенном ниже примере поле «день» не существует в таблице событий. Однако мне нужно, чтобы он присутствовал в массиве, чтобы я мог использовать его в EventObserver.php, чтобы создать $ event-> day одновременно с созданием $ event. Я понимаю, что могу создать 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: [] при создании события, чтобы я все еще мог использовать его в Observer?

1 Ответ

0 голосов
/ 02 ноября 2018

Eloquent не хранит какие столбцы существуют в таблице. Поэтому он будет пытаться вставить любые поля, которые вы передадите, в метод create, если они не заблокированы защитой массового назначения.

Одним из способов избежать этого является явное объявление всех полей в свойстве $ fillable вашей модели. Защита массовых назначений в модели отфильтрует все поля, которые не существуют в $ fillable. Это помешает вашему наблюдателю работать должным образом, поскольку в атрибутах модели не будет «день».

В вашем случае вы никогда не должны создавать индекс 'day' в вашей EventFactory. Зачем вам создавать индекс, который не существует на фабрике для модели? Существуют гораздо лучшие способы создания связанных данных, например создание и использование другой фабрики для связанных моделей.

Вы также можете создавать свои собственные методы для создания и заполнения модели и связанных данных. Я бы не стал переопределять функциональность создания по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...