我用的是带热诚包装的便便。
当我想更新一行时,我遇到了一些问题。
我有两个模型客户端和地址相关的morphone关系。
这种关系很好,当我想得到客户端时,这一行返回预期的结果:
Client::with('address')->find($id);但我不明白如何用干净的解决方案更新客户端。有人可以回答这些问题:
当我在update方法中记录输入::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.当我使用更新时,保存或推送(雄辩的方法)雄辩者不明白他应该更新地址模型,然后更新相关的客户模型。我的数据格式不是很好?
谢谢。
更新:
当我执行Log::info(输入::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'));但是,由于输入::只有(‘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']);这工作做得很好!
但我不明白为什么热情的自我水化失败..。
谢谢。
发布于 2014-05-31 22:50:38
没有什么像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不太确定。
https://stackoverflow.com/questions/23972017
复制相似问题