具有自定义键的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,或者根据需要创建单独的服务提供商。