Laravel: заполнить форму свойствами, полученными из нескольких моделей

Пытаюсь построить форму для редактирования информации об офисах. Эта форма построена с использованием информации, поступающей из двух моделей: Office и Address. Как вы видите на изображении поля, отмеченные цифрой 1, относятся к модели адреса, поля, отмеченные цифрой 2, относятся к офисам.

Laravel: заполнить форму свойствами, полученными из нескольких моделей

У офиса один адрес

office.php

public function address()
{
    return $this->hasOne('App\Address');
}

Адрес принадлежит офису

address.php

public function office()
{
    return $this->belongsTo('App\Office');
}

Теперь, чтобы заполнить окно редактирования, мне нужно привязать две модели к форме!

Я пробовал это:

{!! Form::model($element, ['method'=>'PATCH', 'action'=> ['AdminofficeController@update', $element->slug ],'files'=>true]) !!} 

{!!Form::label('image', 'Upload a Featured Image') !!}
{!!Form::file('image', null, array('class' => 'form-control'))!!}

...here fields from office model...

{!! Form::label('street', 'Street:', array('class' => 'pt-3'))!!}
{!! Form::text($element->address->street, null, array('class'=>'form-control' )) !!}
 ... here other fields ...

{!!Form::submit('Edit Büro', array('class' => 'btn btn-success btn-block')) !!}
{!!Form::close() !!} 

Но я получаю следующую ошибку:

Свойство [улица] не существует в этом экземпляре коллекции. (Вид: C: \ laragon \ www \ domain \ resources \ views \ dashboard \ bueros \ edit.blade.php)

Эта строчка не решает проблему

{!! Form::text($element->address->street, null, array('class'=>'form-control' )) !!}

У меня есть коллекция var_dump te, и действительно, у нее есть свойство street, это означает, что отношение работает нормально.

Насколько я знаю, я не могу привязать две модели к одной форме (не в HTML)

Как мне заполнить форму свойствами, полученными из нескольких моделей?

Я бы не хотел создавать две формы: одну для редактирования адреса, а другую - для названия офиса.

Ошибка фактически указывает на источник вашей проблемы. Отношение $element->address должно содержать экземпляр модели Address в соответствии с вашим определением, а не экземпляр Collection, как указывает ошибка. Возможно, вы захотите узнать, почему это так.

Bogdan 13.05.2018 10:47

@Bogdan, спасибо за ответ. Я изменил структуру модели, теперь она получает экземпляр адреса

Rafael Munoz 13.05.2018 15:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
175
1

Ответы 1

Это старый вопрос, но вот ответ, который мне подходит.

Ваша первая строка формы:

{!! Form::model($element, ['method'=>'PATCH', 'action'=> ['AdminofficeController@update', $element->slug ],'files'=>true]) !!} 

следует изменить на:

{!! Form::model($building->toArray() + $address->toArray(), ['method'=>'PATCH', 'action'=> ['AdminofficeController@update', $element->slug ],'files'=>true]) !!} 

Я не уверен на 100%, что требуется -> toArray (), но это работает для форм, которые у меня есть с несколькими моделями, которые я хочу заполнить автоматически.

Примечание: переменные $ building и $ address будут такими, какие вы использовали в своем коде.

Другие вопросы по теме