Nano Hash - криптовалюты, майнинг, программирование

Ardent + Laravel, автогидратация

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

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

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

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

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

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

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

Когда я регистрирую 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":"[email protected]","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. Когда я использую обновление, сохранение или нажатие (метод красноречивого), красноречивый не понимает, что он должен обновить модель адреса, а затем обновить связанную модель клиента. Формат моих данных неправильно сформирован?

Спасибо.

ОБНОВЛЕНИЕ:

Когда я делаю 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":"[email protected]","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"}} [] []

С автогидратацией ardent это не работает... Автогидратация клиента прошла успешно, а Address нет, возможно, из-за полиморфной связи (один-к-одному) между ними.

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

$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":"[email protected]"} [] []
[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']);

Это работает довольно хорошо!

Но я не могу понять, почему у ardent не работает автогидратация...

Спасибо.

31.05.2014

Ответы:


1

Нет ничего похожего на 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'] или пустой массив для обработки массовое назначение. В этом случае, если у вас есть поле 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, а затем сохранить их, вот и все.

Кстати, не уверен насчет Ardent.

31.05.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..