模型功能中的Laravel联合

时间:2017-05-06 22:45:06

标签: php mysql laravel union models

你好,我是新来的,不是母语为英语的人,所以请原谅我的语法错误和格式问题。

我使用laravel framework 5.4版本使用php构建应用程序。 Web应用程序非常简单,用于审阅发布文章的文章和用户。

我想学习如何在模型中结合函数的结果。 我希望用户模型中的allReviews函数返回用户与其文章按创建时间排序的评论混合的评论。

让我更好地解释一下。

这是我的3个主要表格:

Users     | Articles  | Reviews
--------- | --------- | --------- 
id        | id        | id
name      | user_id   | reviewable_id
email     | title     | reviewable_type
password  | body      | reviewtext
etc..     | etc..     | created_time

这是我的模型代码:

class User extends Model{

    protected $table = 'users';

    public function articles()
    {
        return $this->hasMany(Article::class,'user_id');
    }

    public function reviews(){
        return $this->morphMany(Review::class,'reviewable');
    }

    public function allReviews(){
        /*
         i want union something like this:

        $result = $this->reviews() union
        foreach ($this->Articles() as $Article) {
            union $Article->reviews();
        }
        orderby created_time ASC or DESC doesn't matter

        return $result
        */
    }
}

class Article extends Model{

    protected $table = 'articles';

    public function user()
    {
        return $this->belongsTo(User::class,'user_id');
    }

    public function reviews(){
        return $this->morphMany(Review::class,'reviewable');
    }
}

class Review extends Model{

    protected $table = 'reviews';

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

所以我的问题是如何从用户那里完成allReviews功能?

任何帮助表示赞赏:) 谢谢

1 个答案:

答案 0 :(得分:0)

调用$ user-> reviews属性将返回所有可审核的模型。你没有UNION任何东西,Eloquent会为你照顾。

试试这个:

public function allReviews(){
    $reviews = new \Illuminate\Database\Eloquent\Collection;

    foreach($this->articles as $article)
    {
        $reviews = $reviews->merge($article->reviews);
    }

    $reviews = $reviews->merge($this->reviews);

    return $reviews;
}

我现在真的很累,我觉得你可能会遇到N + 1查询问题,但它应该适合你。