Ardent + Laravel,自动水合物关系

 奶油泡芙2覀21 发布于 2023-01-12 12:42

我用lavarel和热情的包装.

当我想要更新一行时,我遇到了一些问题.

我有2个模型客户端和地址相关的morphone关系.

这种关系很好,当我想得到一个客户端这一行返回预期的结果:

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

但我无法理解如何使用干净的解决方案更新客户端.有人可以回答这些问题:

    有了Ardent你怎么能自动修复相关模型?

    当您更新一些数据时,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":"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.当我使用更新,保存或推送(eloquent的方法)时,雄辩不明白他应该更新地址模型然后更新相关的客户端模型.我的数据格式不是很好吗?

谢谢.

更新:

当我执行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"}} [] []

随着ardent的自动水化不起作用...客户端成功自动水合但地址不成功,可能是由于它们之间的多态关系(一对一).

我尝试用这种方式填充我的模型:

$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']);

这项工作相当不错!

但我无法理解为什么热情的自动水合失败......

谢谢.

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这里(ClientAddress)你需要提供一个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方法填充模型然后保存它们,就可以应用它,就是这样.

    BTW,不确定Ardent.

    2023-01-12 12:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有