php – 使用Laravel Eloquents HasManyThrough通过多态关系与多
我有一个相当简单的应用程序,用户可以报告其他用户的评论和食谱.我使用多态关系来存储报告.哪个工作正常;但是,我现在正试图让用户犯下的罪行.
获取用户报告不是问题,可以使用user-> reports()直接完成,但我非常希望获得其他人报告该用户的报告.我可以使用hasManyThrough关系或者一次仅在一个模型上进行查询. 恩. public function offenses() { return $this->hasManyThrough('Recipe','Reports'); } 要么 ->with('user.recipe.reports') 问题是我的可报告对象不仅仅是食谱,它可能是注释,图像等.因此,不必使用多个函数,逻辑方法是以某种方式解析hasManyThrough各种参数之间的关系. 理论上看起来像这样: public function offenses() { return $this->hasManyThrough(['Recipe','RecipeComments'],'Reports'); } 这有可能吗?有一些没有文档的语法?如果不是,有任何聪明的解决方法/黑客? 可能的方案? 可接受的解决方案是在我的报告表上添加另一列并且只添加这样的offender_id吗? ID | User_id | Offender_id | Reportable_type | Reportable_id 这意味着我可以在我的用户模型上建立关系,通过该列连接攻击.但这会被视为多余吗?由于我已经通过可报告模型获得了罪犯? 楷模 多态模型 class Report extends Model { public function reportable() { return $this->morphTo(); } public function User() { return $this->belongsTo('AppUser'); } } 食谱模型 class Recipe extends Model { public function user() { return $this->belongsTo('AppUser'); } public function reports() { return $this->morphMany('AppReport','reportable'); } } 评论模型 class RecipeComment extends Model { public function user() { return $this->belongsTo('AppUser'); } public function reports() { return $this->morphMany('AppReport','reportable'); } }
使用当前模型,您可以通过以下代码接收用户的所有报告模型:
$recipeCommentReport = RecipeComment::whereHas('reports',function($q){ return $q->where('user_id','=',Auth::user()->id) }); $recipeReport = Recipe::whereHas('reports',Auth::user()->id) }); //Get all reports into one $reports = $recipeReport->merge([$recipeCommentReport]); 这充其量是凌乱的,因为: >鉴于我们使用两个单独的数据库查询,我们无法对结果进行排序. 最好的解决方案,就像你上面已经想到的那样: 将offender_id列添加到报表中. 它更清洁,遵循DRY原则. 典型案例场景 获取用户的所有食谱评论报告 Report::where('offender_id',Auth::check()->id) ->where('reportable_type','RecipeComment') ->get(); 按类型计算用户的攻击 Report::where('offender_id',Auth::check()->id) ->grouBy('reportable_type') ->select(Db::raw('count(*)'),'reportable_type') ->get(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |