当前位置: 首页 > 知识库问答 >
问题:

使用Laravel雄辩词通过多态性具有多种关系

于高雅
2023-03-14

我得到了一个相当简单的应用程序,用户可以报告其他用户的评论和食谱。我使用多态关系来存储报告。它工作得很好;然而,我现在正试图了解用户所犯的罪行。

获取用户报告不是问题,这可以直接使用user完成-

前任。

public function offenses() {
    return $this->hasManyThrough('Recipe', 'Reports');
}

->with('user.recipe.reports')

问题是,我的可报告对象不仅仅是配方,还可能是注释、图像等。因此,不必使用多个函数,合乎逻辑的方法是通过各种参数解析hasmany之间的关系。

理论上看起来像这样:

public function offenses() {
    return $this->hasManyThrough(['Recipe', 'RecipeComments'], 'Reports');
}

这有可能吗?使用一些未记录的语法?如果没有,是否有任何聪明的解决方法/技巧?

一个可接受的解决方案是在我的报告表中添加另一列,并且只添加这样的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('App\User');
    }
}

配方模型

class Recipe extends Model {
    public function user() {
        return $this->belongsTo('App\User');
    }

    public function reports() {
        return $this->morphMany('App\Report', 'reportable');
    }
}

注释模型

class RecipeComment extends Model {   
    public function user() {
        return $this->belongsTo('App\User');
    }

    public function reports() {
        return $this->morphMany('App\Report', 'reportable');
    }
}

共有1个答案

万明辉
2023-03-14

使用当前模型,您可以通过以下代码接收用户的所有报告模型:

$recipeCommentReport = RecipeComment::whereHas('reports',function($q){
   return $q->where('user_id','=',Auth::user()->id) 
});

$recipeReport = Recipe::whereHas('reports',function($q){
   return $q->where('user_id','=',Auth::user()->id) 
});

//Get all reports into one
$reports = $recipeReport->merge([$recipeCommentReport]);

这充其量是混乱的,因为:

  1. 我们无法对结果进行排序,因为我们使用的是两个单独的db查询

最好的解决方案,就是如你上面所说:

offender_id列添加到报表表中。

它更干净,遵循干燥原则。

典型案例情景

获取用户的所有配方注释报告

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();
 类似资料:
  • 我有三张桌子: 每当我尝试添加时,我试图获得一个帖子,它会自动添加一个,其中包含,表以及,同时,一旦创建了,它还应该记录和,但我使用多对多关系和结束了这个错误。如何使用eloquent添加和? 这就是我迄今为止所尝试的。 控制器。php 使用者php UserACcount.php Verification.php 账户php 我尝试使用这个功能,完全可以正常工作,但我很确定这就是它如何与雄辩。

  • 我刚刚开始学习LaravelV3,我试图通过创建一个博客来了解eloquent的一对多关系。我的帖子与类别有多对一的关系(每个帖子都链接到一个类别)。 我有以下表格和以下字段: 帖子:id、标题、正文、创建日期、类别id 类别:id、名称 我有以下两种型号: 我想出了如何通过传递类别id来获得所有帖子: 我只是需要帮助,找出如何获得所有的职位,并得到他们的更正类别。因此,在视图中的一天结束时,我可

  • 我有帖子表和评论表。我想得到所有的帖子与它的评论和以下返回只是帖子有评论: 更新 例如 ID帖 1个职位1 2后2 id post\u id评论 1萨姆勒大学评论 Post::with('comments')只返回有注释的帖子,它只返回第一篇帖子,因为第二篇帖子没有注释,我想获取所有帖子(有注释或没有注释)

  • 我正在使用Laravel 5创建一个博客,但我对多对多(通过透视表)关系有一个奇怪的问题。我的DB设置如下: 文章表: id|bigint|20|PK|不为空|自动增量 title|varchar|255|不为空 body|text|不为空 category_id|bigint|20|不为空 created_at|时间戳|不空 updated_at|时间戳|非空 已发布|布尔值|非空 delete

  • 我正在尝试使用Laravel雄辩的模型查询多个表,这些模型具有一对一、一对多和多对多的关系。 我有一个表,一个表,一个表和一个透视表。 每个表单有一个品牌和一个用户: 品牌没有任何外键: 用户没有任何外键: 有一个数据透视表可以创建多对多的关系,用于创建拥有许多用户(如品牌成员)的品牌组: 我试图通过直接所有权()或品牌成员身份获取属于用户的所有表单,通过多对多透视表获取用户所属的所有品牌的所有表

  • 我使用的是Laravel 5.4,其模型和表格结构如下: 一个用户可以有多个账户 一个帐号可以被多个用户共享 每个账户有多个持有量 因此,用户通过他们的许多帐户间接拥有许多资产。 我需要帮助在用户模型上定义一个称为“持有量”的关系,以获得适用于用户的所有持有量(基于他们所链接的账户)。 我尝试了很多不同的东西,在谷歌上花了很长时间。我可以接近BelongToMany和hasManyThrough,