Laravel与自定义键

时间:2017-04-25 13:42:56

标签: laravel eloquent laravel-5.4

我在使用Laravel

中的多态关系时遇到了一些问题

表格

Vacations
    id
    name

Posts
    id
    name

Images
    id
    type_id
    type

Images.type_id指向posts.idvacations.id的链接 Images.type可以是postvacation

帖子和假期可以有很多图片,但每张图片只属于1个帖子或假期。

假期模式

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);

我可以看到Laravel试图跑:

select * from `images` where `images`.`type_id` = 1 
and `images`.`type_id` is not null 
and `images`.`type` = App\Vacation

当我运行此“原始”并将"App\Vacation"替换为vacation时,我会得到我的结果。

将命名空间的类名传递给原始sql查询是否正常?

我尝试将Images.type值从复数更改为单数但仍然失败。

我做错了什么?

编辑:这是Laravel 5.4,最新版本afaik。

3 个答案:

答案 0 :(得分:8)

对于它的价值,可以在不更新数据库的情况下实现您的目标。

我在遗留数据库中遇到了同样的问题,我通过将以下内容添加到bootstrap/app.php来修复它。

\Illuminate\Database\Eloquent\Relations\Relation::morphMap([
    'vacation' => \App\Vacation::class,
    'post' => \App\Post::class
]);

答案 1 :(得分:0)

添加到度假课程 这条线         protected $morphClass = 'vacation';

如果你想把模特名称作为假期痛苦

答案 2 :(得分:0)

images中,您的列type应包含模型名称,在您的情况下应为App\VacationApp\Post

enter image description here