Laravel多态关系问题

时间:2014-03-09 08:27:15

标签: mysql laravel laravel-4

建议此link中的

不要使用Polymorphic Relations

例如,对于此Sql命令,我们必须没有FOREIGN KEY

CREATE TABLE Comments (

    comment_id SERIAL PRIMARY KEY,

    comment TEXT NOT NULL,

    issue_type VARCHAR(15) NOT NULL CHECK (issue_type IN (`Bugs`, `Features`)),

    issue_id INT NOT NULL,

    FOREIGN KEY issue_id REFERENCES ???

);

然后我们必须有:

CREATE TABLE Comments (

    comment_id SERIAL PRIMARY KEY,

    comment TEXT NOT NULL,

    issue_type VARCHAR(15) NOT NULL CHECK (issue_type IN (`Bugs`, `Features`)),

    issue_id INT NOT NULL,

);

此命令在使用JOIN或同时使用JOIN时遇到问题,例如:

SELECT * FROM Comments c

LEFT JOIN Bugs b ON (c.issue_type = 'Bugs' AND c.issue_id = b.issue_id)

LEFT JOIN Features f ON (c.issue_type = 'Features' AND c.issue_id = f.issue_id);

这些问题仅适用于SELECT其他问题:UPDATEDELETE

是什么方式来解决这个问题?

更新 如何找到帖子所有者?

1 个答案:

答案 0 :(得分:0)

Laravel有多态关系,见这里:http://laravel.com/docs/eloquent#polymorphic-relations

您的数据库表设置相同(除非您需要使用commentable_idcommetnable_type来处理以下代码示例),并且在您的模型中执行以下操作:

class Comment extends Eloquent {

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

}

class Bug extends Eloquent {

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

}

class Feature extends Eloquent {

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

}

然后您可以使用它:

$bug = Bug::find(1)->comments();

你也可以采取其他方式,所以如果你只是获取一个评论列表,那么你可以获得该评论的所有者,而不知道它是什么:

$comment = Comment::find(1);

$commentable = $comment->commentable; 
// this will load the bug or feature that the comment belongs to