Laravel 5 - 具有条件的多态性注释表

时间:2015-03-30 19:39:05

标签: model polymorphism laravel-5

在我的程序中,用户可以对新闻和比赛发表评论。

Comment table:

id - (primary)
comment_type - (1 =  match, 2 = news)
comment_id (The id to the type. News.id or match.id)
profile_id
text

我的关系有问题,因为评论表可以存储新闻评论和匹配评论,因此我没有外键。

我试过这样做:

Comment model

 public function comment()
    {
        return $this->morphTo();
    }

News model

public function comments()
    {
        return $this->morphMany('App\Comment', 'comment');
    }

我希望评论在一个表中,而不是match_comment和news_comment表。

当我调用$ news->注释时,它会返回一个空数组。

有人可以帮忙吗?

提前致谢 安德烈亚斯

1 个答案:

答案 0 :(得分:1)

您正在尝试将Laravel的内置多态关系支持与不支持它的数据库结构一起使用。 relevant section of the manual说的是这样的(为你的场景稍微调整一下):

  

这里要注意的关键字段是评论表中的[commentable_id]和[commentable_type]。 ID将包含ID值,在此示例中为拥有[match]或[news],而类型将包含拥有模型的类名 [即不是像1 =匹配和2 =新闻这样的整数。这是允许ORM在访问[commentable]关系时确定返回哪种类型的拥有模型的原因。

我不确定你是否能够将其弯曲以适应您给定的表结构。如果可以,您应该更改它 - 或者您可能需要在模型上坚持使用自定义查询或便捷方法来访问此数据。

所以,为了回答你的实际问题,我相信你最终会得到$news->comments的空结果,因为在幕后运行的查询是这样的:

SELECT * FROM `comments` WHERE comment_id = {$news->id} AND comment_type = 'App\News';

修改

根据文档中的示例结构,您可能需要一个表格结构:

news
    id - integer
    other columns...      

matches
    id - integer
    other columns...

comments
    id - integer
    text - string
    commentable_id - integer
    commentable_type - string

然后,您还需要调整您的新闻和匹配课程,以便:

public function comments()
{
    return $this->morphMany('App\Comments', 'commentable');
} 

请注意可注释参数是指应在Comment类上的方法:

class Comment extends Model {

    public function commentable()
    {
        return $this->morphTo();
    }
}

(很重要,因为您已表明您目前正在使用comment()作为方法名称)