具有自定义键的Laravel多态关系
我在拉威尔的工作中遇到了一些问题 表格具有自定义键的Laravel多态关系,laravel,eloquent,laravel-5.4,Laravel,Eloquent,Laravel 5.4,我在拉威尔的工作中遇到了一些问题 表格 Vacations id name Posts id name Images id type_id type Images.type_id链接到posts.id或vacations.id Images.type是post或vacation 帖子和假期可以有许多图片,但每个图片只属于一个帖子或假期 度假模式 namespace App; use App\Vacation; class Vaca
Vacations
id
name
Posts
id
name
Images
id
type_id
type
Images.type_id
链接到posts.id
或vacations.id
Images.type
是post
或vacation
帖子和假期可以有许多图片,但每个图片只属于一个帖子或假期
度假模式
namespace App;
use App\Vacation;
class Vacation extends Model
{
public function images()
{
return $this->morphMany('App\Image', 'imageable', 'type', 'type_id');
}
}
namespace App;
use App\Image;
class Image extends Model
{
public function imageable()
{
return $this->morphTo();
}
}
图像模型
namespace App;
use App\Vacation;
class Vacation extends Model
{
public function images()
{
return $this->morphMany('App\Image', 'imageable', 'type', 'type_id');
}
}
namespace App;
use App\Image;
class Image extends Model
{
public function imageable()
{
return $this->morphTo();
}
}
当我运行这个时,我得到一个空数组,但是有匹配的记录
$vacation = Vacation::find(1);
dd($vacation->images);
我可以看到拉威尔正试图逃跑:
select * from `images` where `images`.`type_id` = 1
and `images`.`type_id` is not null
and `images`.`type` = App\Vacation
当我运行此“原始”并用假期替换应用\假期时,我会得到结果。
将命名空间的类名传递给原始sql查询是否正常
我已尝试将图像。键入值从复数改为单数,但仍然失败
我做错了什么
编辑:这是Laravel 5.4,afaik的最新版本。添加到假期类
这条线
protected$morphClass='vacation'代码>
如果您想在图像中将型号名称命名为假期,则您的类型列应包含型号名称,在您的情况下,可以是App\vacation
或App\Post
不管它值多少钱,都可以实现您想要的,而无需更新数据库
我在一个遗留数据库中也遇到了同样的问题,我通过将以下内容添加到bootstrap/app.php
中修复了它
\Illuminate\Database\Eloquent\Relations\Relation::morphMap([
'vacation' => \App\Vacation::class,
'post' => \App\Post::class
]);
你不需要这些:使用App\Image
和使用App\Vacation代码>。这是哪一个版本的laravel?5.4,删除Use语句没有什么区别。如何存储假期的图像。@AmeerSalahAldeen基本结构在我的帖子中:images.id,images.type_id(链接到假期的id)和images.type是“假期”,“发布”等@stef是的,我只是指向它。你所有的表名都是小写的吗?谢谢,你救了我一天。我使用了旧的雄辩的morphTo(…)
覆盖get多态类型属性($type)
。但是它无法处理带有morphedByMany
的类型。因此,建议您使用AppServiceProvider的此启动功能。您可以在AppServiceProvider的启动功能中注册morphMap,或者根据需要创建单独的服务提供商。