Я использую lavarel с пламенным пакетом.
У меня есть некоторые проблемы, когда я хочу обновить строку.
У меня есть 2 модели клиента и адрес, связанные с отношением morphone.
Это отношение хорошо работает, когда я хочу получить клиента, эта строка возвращает ожидаемый результат:
Client::with('address')->find($id);
Но я не могу понять, как обновить клиент с помощью чистого решения. Кто-то может ответить на эти вопросы:
Когда я регистрирую 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
.