Я очень зеленый в Laravel (первый проект), поэтому терпите меня, если я делаю ошибки новичка. Я пытаюсь создать этот проект во время работы через Laracasts, поэтому я использую его предложения. Я использую Laravel 5.4 и PHP 7.1.4
У меня есть флажок в форме для логического поля. Если флажок не установлен при отправке формы, он возвращает ноль. Я не хочу нулевых значений для логических значений, поэтому у меня есть валидатор, гарантирующий, что он принимает только значения true / false. Чтобы это работало, мне пришлось создать мутатор, чтобы изменить значение на false, если оно было нулевым.
У меня есть две модели, Item и ItemNote. Я пытаюсь создать ItemNote из модели Item. На странице Item есть место для добавления ItemNote, которое проходит через ItemNoteController, затем я вызываю метод в Item для добавления ItemNote. Проблема в том, что я не могу заставить работать мутатор в модели ItemNote, поэтому проверка завершается неудачно, потому что логическое поле (calendar_item) равно нулю.
Сначала я пытался создать ItemNote из отношения с Item, в соответствии с этим переполнением стека Мутаторы Laravel 5 работают только когда я создаю запись, а не когда я обновляю запись Ответ мутатор не запустится при создании через отношение $ this-> notes () -> create ($ request-> all ()). Вы должны использовать модель $ this-> notes-> create ($ request-> all ()), заметив отсутствие скобок после заметок. Поэтому я перепробовал все, что мог придумать, чтобы попытаться создать объект с помощью модели, и все еще не могу запустить мутатор.
Вот объявления отношений в моих моделях:
Вещь
public function notes() { return $this->hasMany(ItemNote::class); }
ItemNote
public function item() { return $this->belongsTo(Item::class); }
Мутатор в ItemNote для calendar_item
protected function setCalendarItemAttribute($value) { $this->attributes['calendar_item'] = isset($value) ? $value : FALSE; }
Правила проверки в ItemNote
public static $validationRules = array('note_date' => 'required|date',
'resolve_date' => 'nullable|date',
'notes' => 'required|string',
'cost' => 'nullable|numeric',
'calendar_item' => 'required|boolean',
'attachment_path' => 'nullable|string|max:200');
Это действие в ItemNoteController, которое выполняется при добавлении ItemNote со страницы Item.
public function store(Item $item)
{
$this->validate(request(), ItemNote::$validationRules);
$item->addNote(new ItemNote(request(['item_note_category_id', 'note_date', 'resolve_date',
'notes', 'cost', 'calendar_item', 'attachment_path'])));
return back();
}
Вот функция addNote в модели Item
public function addNote(ItemNote $note)
{
$this->item_note->save($note);
}
Вот разные вещи, которые я пробовал в addNote, все они не запускают мутатор. У операторов create есть перечисленные назначения полей, но я удалил их здесь для краткости.
$this->notes->save($note);
$this->notes()->save($note);
$this->item_note->save($note);
$this->notes->create
$this->item_notes->create
$this->item_notes()->create
$this->item_note->create
$this->item_note()->create
$this->ItemNote->create
$this->ItemNote()->create
ItemNote::create
Все вышеперечисленное работает, хотя я думаю, что $ this-> item_notes-> create не должно работать вообще, потому что имя отношения — это примечания, но оно не жалуется, что заставляет меня думать, что оно может не попасть в этот код, и это не удалось выполнить оператор проверки в контроллере. Как мне запустить мутаторы до проверки? Или есть лучший способ очистить данные перед проверкой?
Я также попытался поместить поле item_id в правила валидации, но это не всегда получается, потому что item_id не назначается, пока я не создаю объект через отношения. Я хотел бы потребовать это, но не выяснил, как назначить это в запросе.
Любая помощь приветствуется. Простите за длинный пост.
Ваши мутаторы на вашей модели. В то время как вы используете ValidatesRequests
черта контроллера для проверки ваших входных данных запроса. Таким образом, ваши мутаторы будут вызываться только после того, как вы запустите проверку.
Поэтому я вижу, что у вас есть два варианта.
а. Измените ваш HTML, чтобы всегда получать логическое значение. Например, используйте скрытый ввод со значением по умолчанию. Это значение будет отправлено только, если флажок не установлен.
<input name="example" type="hidden" value="0">
<input name="example" type="checkbox" value="1">
б. Увлажните свою модель, чтобы вызвать мутаторов, а затем запустите проверку.
$itemNote = new ItemNote($request->all());
$request->merge($itemNote->toArray());
$this->validate($request, ItemNote::$validationRules);
// ...
Изменить: Вот несколько ссылок на мою проверку модели. Это может быть полезно и дать вам свои собственные идеи.
https://gist.github.com/robsimpkins/2fe0de2483d51f1e4446ec90be7d96ae
https://gist.github.com/robsimpkins/6a2f20853a2d01260ab299ebcebf9673
https://gist.github.com/robsimpkins/7df10abce1cdc07593d8c872a5461425
https://gist.github.com/robsimpkins/c4aa0517a80b794a2d347912100bd6d9
Других решений пока нет …