【发布时间】:2015-03-08 02:18:30
【问题描述】:
我可以找到许多关于此的讨论,但没有明确的解决方案。这里有两个链接,虽然我会在这里涵盖我自己的问题中的所有内容。
简单说明
对于已经熟悉 Laravel 多态关系的人来说,这是对我的问题的简单解释。
当使用 $morphClass 时,在试图查找多态关系的所有者时,使用 $morphClass 的内容作为 morph“类型”保存在数据库中作为类名。这会导致错误,因为 $morphClass 的全部意义在于它不是类的完全命名空间名称。
你如何定义多态关系应该使用的类名?
更详细的解释
这是一个更详细的解释,准确地解释了我正在尝试做的事情以及我为什么要尝试通过示例来做。
在 Laravel 中使用多态关系时,在数据库中保存为“morph_type”类型的任何内容都被假定为类。
所以在这个例子中:
class Photo extends Eloquent {
public function imageable()
{
return $this->morphTo();
}
}
class Staff extends Eloquent {
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
class Order extends Eloquent {
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
数据库如下所示:
staff
- id - integer
- name - string
orders
- id - integer
- price - integer
photos
- id - integer
- path - string
- imageable_id - integer
- imageable_type - string
现在第一行照片可能如下所示:
id,path,imageable_id,imageable_type
1,image.png,1,员工
现在我既可以从员工模型访问照片,也可以从照片模型访问员工。
//Find a staff member and dump their photos
$staff = Staff::find(1);
var_dump($staff->photos);
//Find a photo and dump the related staff member
$photo = Photo::find(1);
var_dump($photo->imageable);
到目前为止一切顺利。但是,当我为它们命名时,我遇到了问题。
namespace App/Store;
class Order {}
namespace App/Users;
class Staff {}
namespace App/Photos;
class Photo {}
现在我的数据库中保存的是这样的:
id,path,imageable_id,imageable_type
1,image.png,1,应用/用户/员工
但我不希望那样。像这样将完整的命名空间类名保存在数据库中是一个糟糕的主意!
幸运的是,Laravel 有一个设置 $morphClass 变量的选项。像这样:
class Staff extends Eloquent {
protected $morphClass = 'staff';
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
现在我的数据库中的行看起来像这样,太棒了!
id,path,imageable_id,imageable_type
1,image.png,1,员工
获取工作人员的照片绝对没问题。
//Find a staff member and dump their photos
$staff = Staff::find(1);
//This works!
var_dump($staff->photos);
但是,查找照片所有者的多态魔法不起作用:
//Find a photo and dump the related staff member
$photo = Photo::find(1);
//This doesn't work!
var_dump($photo->imageable);
//Error: Class 'staff' not found
据推测,在使用 $morphClass 时,必须有一种方法可以告知多态关系使用什么类名,但我在文档、源代码或 Google 中找不到任何关于这应该如何工作的参考。
有什么帮助吗?
【问题讨论】:
-
你有没有尝试通过命名空间传递给 $this->morphOne() 模型名称?
-
会是哪个论点?
-
首先,返回 $this->morphOne('App/Photos/Photo', 'imageable');
-
啊,是的,我已经这样做了,抱歉,再次复制和粘贴整个内容似乎不值得,但这没什么区别。问题在于 morphTo() 而不是 morphOne()
标签: laravel laravel-4 polymorphism eloquent