【问题标题】:Laravel union within model functions模型函数中的 Laravel 联合
【发布时间】:2017-10-05 04:22:14
【问题描述】:

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

我正在使用 laravel 框架 5.4 版本构建一个带有 php 的应用程序。 该网络应用程序非常简单,可用于评论文章和发布文章的用户。

我想了解如何在我的模型中合并函数的结果。 我希望用户模型中的 allReviews 函数返回用户混合的评论以及他的文章在 createdtime 下排序的评论。

让我解释得更好。

这是我的 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 功能起作用?

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

【问题讨论】:

    标签: php mysql laravel union models


    【解决方案1】:

    调用 $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 查询问题,但它应该适合你。

    【讨论】:

    • 感谢您的快速回复,但这只会返回用户得到的评论.谢谢
    • 您似乎有一个重复的表名,您对文章模型和评论模型都使用了“文章”。此外,您的模型类不应该是复数形式。将评论重命名为评论。将 Review->table 属性更改为“reviews”并创建正确的迁移。
    • 啊,我真的很抱歉刚刚注意到并更改了它,但我仍然不知道如何使功能 allReviews 工作:(
    • the user->reviews 只返回用户有的评论,不包含他的文章有的评论。
    • 非常感谢!!!!!!!!!现在它似乎工作得很好,会给它一个广泛的测试,后者有更多的数据!!!!!!!再次感谢!
    猜你喜欢
    • 2019-03-29
    • 2017-02-23
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2018-04-15
    • 2020-02-25
    • 2021-07-03
    • 2020-05-06
    相关资源
    最近更新 更多