在 Laravel 4 中保存一对一的多态关系
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23273817/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Saving a One to One Polymorphic relation in Laravel 4
提问by Joaquín L. Robles
I'm having some trouble while saving a polymorphic one-to-one relation with Laravel 4, this is my model:
我在保存与 Laravel 4 的多态一对一关系时遇到了一些麻烦,这是我的模型:
namespace App\Models\Proveedores;
class Proveedor extends \Eloquent {
public function proveedorable () {
return $this->morphTo('proveedorable', 'proveedorable_type', 'proveedorable_id');
}
And this is the specific model:
这是具体的模型:
namespace App\Models\Proveedores;
class ProveedorTerminacion extends \Eloquent {
public function proveedor () {
return $this->morphOne ('App\Models\Proveedores\Proveedor', 'proveedorable', 'proveedorable_type', 'proveedorable_id');
}
This way I'm trying to save a Proveedor
associated with a specific ProveedorTerminacion
model, but for some reason a row for ProveedorTerminacion
is created in my table, but not for Proveedor
and Laravel won't show any error and return an empty response, what's wrong?
这样我试图保存一个Proveedor
与特定ProveedorTerminacion
模型相关联的,但由于某种原因,ProveedorTerminacion
在我的表中创建了一行,但不是 forProveedor
并且 Laravel 不会显示任何错误并返回一个空响应,有什么问题?
$terminador = ProveedorTerminacion::create (Input::all());
$proveedor = new Proveedor;
$proveedor->fill (Input::all());
$proveedor->proveedorable()->associate ($terminador);
$proveedor->save ();
回答by Jarek Tkaczyk
Associate method doesn't work correctly with morphTo, as it is never setting morphable_type, so don't use it. I'm pretty sure your code should throw fatal error because of that by the way. It requires bugfix.
Associate 方法不能与 morphTo 一起正常工作,因为它从不设置 morphable_type,所以不要使用它。顺便说一下,我很确定你的代码应该抛出致命错误。它需要修正错误。
Instead invert creating the relation and do it in the context of morphable object:
而是反转创建关系并在可变形对象的上下文中执行此操作:
$terminador = ProveedorTerminacion::create (Input::all());
$proveedor = new Proveedor;
$proveedor->fill (Input::all());
$terminador->proveedor()->save($proveedor);
I'm fixing that and going to send a PR to the laravel repo after some testing. I'll update my answer when it's done.
我正在解决这个问题,并在经过一些测试后将 PR 发送到 laravel 存储库。完成后我会更新我的答案。
Here it is: https://github.com/laravel/framework/pull/4249