Intereting Posts
Оператор MySQL SELECT: как получить один точный результат строки из похожих строк? Синтаксис php для новой строки не работает Предупреждение о `$ HTTP_RAW_POST_DATA` устарело Скрининг экрана и сеансы PHP Удаленная отладка PHP: XDebug не может подключиться к клиенту JetBrains php Storm Многомерные массивы, проверьте разницу Выполнять скрипт php ежедневно с помощью wordpress Расширение DOMDocument и DOMNode: проблема с объектом возврата Как перейти от php MySQL sql инъекции уязвимых запросов к MySQLi не уязвимых запросов Белое пространство появляется ниже липкого нижнего колонтитула, только в PHP AJAX (prototype / php) получает частичные обновления статуса во время выполнения сценария Предупреждения 'xmlParseEntityRef: no name' при загрузке xml в файл php synology php ftp_ssl_connect – вызов неопределенной функции Эхо PHP внутри Javascript? Отправка электронной почты с PHP с помощью SMTP и электронной почты идет на спам. Какой будет самый простой способ отправить электронную почту во входящие?

Ярость + Ларавел, отношение автогидратов

Я использую lavarel с пламенным пакетом.

У меня есть некоторые проблемы, когда я хочу обновить строку.

У меня есть 2 модели клиента и адрес, связанные с отношением morphone.

Это отношение хорошо работает, когда я хочу получить клиента, эта строка возвращает ожидаемый результат:

Client::with('address')->find($id); 

Но я не могу понять, как обновить клиент с помощью чистого решения. Кто-то может ответить на эти вопросы:

  1. С пылкой, как вы могли бы связать свою модель с autoHydrate?
  2. Когда вы обновляете некоторые данные, какая лучшая практика в lavarel? Использовать обновление methdod? Использовать сохранение? Использовать push? Заполнить все модели? Использовать автоматический гидрат?

Когда я регистрирую Input :: all () в моем методе обновления, я получаю следующее:

 [2014-05-31 15:52:56] production.INFO: {"id":983,"firstName":"Susanne","lastName":"Adam","birthDate":"18\/06\/1982","inscriptionDate":"08\/09\/2013","status":3,"created_at":"2014-05-31 14:26:25","updated_at":"2014-05-31 14:26:25","email":"bernard.alix@free.fr","address":{"id":983,"address":"avenue Etienne","address2":"","ville":"Cordierboeuf","cp":"25 10","phone":"0403983157","mobile":"+33 (0)3 0","addressable_id":983,"addressable_type":"Client","created_at":"2014-05-31 14:27:58","updated_at":"2014-05-31 14:27:58"}} [] [] 

Как вы видите, данные адреса находятся внутри данных клиента.

3. Когда я использую update, save или push (eloquent's method), красноречивый не понимает, что он должен обновить модель адреса, а затем обновить соответствующую модель клиента. Формат моих данных плохо сформирован?

Благодарю.

ОБНОВИТЬ :

Когда я делаю Log :: info (Input :: all ()), я получаю следующие данные json в контроллере:

 [2014-06-01 18:10:46] production.INFO: {"id":284,"firstName":"Andr\u00e9e","lastName":"Adam","birthDate":"23\/07\/1944","inscriptionDate":"22\/11\/2013","status":2,"created_at":"2014-06-01 15:41:22","updated_at":"2014-06-01 18:06:44","email":"monique17@normand.com","address":{"id":284,"streetAddress":"93, avenue Lefort","streetAddress2":"","city":"Boulay-sur-Leger","zipCode":"14054","phone":"09 51 03 1","mobile":"+33 6 00 6","addressable_id":284,"addressable_type":"Client","created_at":"2014-06-01 15:42:50","updated_at":"2014-06-01 18:06:44"}} [] [] 

С автогидратацией пылкого, которая не работает … Клиентский автогидрат успешно, но адрес не может быть, возможно, из-за полиморфного отношения (один к одному) между ними.

Я пытаюсь заполнить свои модели таким образом:

 $client = Client::with('address')->find($id); $client->update(Input::except('address')); $client->address->update(Input::only('address')); 

но это не работает, потому что Input :: only ('address') дает неверные сформированные данные, когда я регистрирую это, я получаю следующее:

 Log::info(Input::except('address')); Log::info(Input::only('address')); //output [2014-06-01 18:20:34] production.INFO: {"id":284,"firstName":"Andr\u00e9e","lastName":"Adam","birthDate":"23\/07\/1944","inscriptionDate":"22\/11\/2013","status":2,"created_at":"2014-06-01 15:41:22","updated_at":"2014-06-01 18:10:46","email":"monique17@normand.com"} [] [] [2014-06-01 18:20:34] production.INFO: {"address":{"id":284,"streetAddress":"93, avenue Lefort","streetAddress2":"","city":"Boulay-sur-Leger","zipCode":"14054","phone":"09 51 03 1","mobile":"+33 6 00 6","addressable_id":284,"addressable_type":"Client","created_at":"2014-06-01 15:42:50","updated_at":"2014-06-01 18:06:44"}} [] [] 

Поэтому я смешиваю два метода:

 $inputs = Input::except('_method'); $client = Client::with('address')->find($id); $client->update(Input::except('address')); $client->address->update($inputs['address']); 

Это работает очень хорошо!

Но я не могу понять, почему автогидратация пылкого не получается …

Благодарю.

Нет ничего, как clean или best practice но ситуация требует. Вы можете попробовать что-то подобное в зависимости от ваших потребностей:

 // Get the Client $client = Client::with('address')->find($id); // Fill and save both Client and it's related model Address $client->fill(array(...))->address->fill(array(...))->push(); 

Одна вещь, которую вы должны знать, что в обеих models здесь ( Client и Address ) вам необходимо предоставить protected $fillable = ['propeertyName'] массив protected $fillable = ['propeertyName'] или пустой массив для обработки массового присвоения . В этом случае, если у вас есть поле name в таблице clients и в вашей таблице addresses если у вас есть поле block вы можете просто использовать;

 $client->fill(array('name' => 'Jhon')) ->address->fill(array('block' => 'd')) ->push(); 

В этом случае оба поля будут обновляться в обеих таблицах. если вы отправляете все поля, используя форму, содержащую свойства для Client и Address тогда вы должны выбрать соответствующие поля элементов / форм из входного массива. Так, например:

 $inputs = Input::except('_method'); // All fields for both tables in $inputs // Get the fields for Client model, get all // but not fields that belongs to address table $addressData = array('road', 'block', 'city'); $clientData = Input::except($addressArray); // get all but fields of Address // Fill and save both Client and it's related model Address $client->fill($clientData)->address->fill($addressdata)->push(); 

Также вы можете использовать:

 $client = Client::with('address')->find($id); $client->fill(Input::all()); // Or maybe Input::only([...]) or except([...]) $client->address->city = 'someNewCity'; $client->push(); 

Вы можете использовать save в обеих моделях отдельно, но push сохраняет как для вас. Также вы можете попробовать

 $client = Client::with('address')->find($id); $client->update(Input::except('city')); $client->address->update(Input::only('city')); 

Фактически, save или push могут быть применены, если модели заполняются их полями / свойствами и create/update сначала fill моделей, используя метод fill а затем сохраняют их, вот и все.

BTW, не уверен в Ardent .