草庐IT

php - Laravel WhereHas 与多态关系

coder 2023-10-21 原文

whereHas 方法似乎不太有效。

$res = Entreprise::whereHas('labels',function ($q)
    {
        $q->where('hidden','!=',1);
    })
    ->whereHas('labels',function ($q)
    {
        $q->whereHidden(1);
    })
    ->get();
 dd(count($res));  //shows int 2

这是标签关系:

public function labels()
{
    return $this->morphToMany('Label', 'labelable');
}

这是数据库:

id | nom                | deleted_at | created_at          | updated_at          | junior_id | label_type_id | abbreviation | id_siaje | hidden 
 6 | Environnord        | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |         1 |             4 | EnvNord      |        0 |      1 
 7 | Salon créer        | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |         1 |             4 | Créer        |        0 |      1 
 8 | Salon WebAnalytics | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |         1 |             4 | Web          |        0 |      0 

当我这样做时:

$res = Entreprise::whereHas('labels',function ($q)
    {
        $q->where('hidden','!=',1);
        $q->whereHidden(1);
    })->get()
dd(count($res)); //int 0

我得到了期望值。

在我的数据库中,一个企业对象没有超过 1 个标签,因此标签要么隐藏,要么不隐藏,因此其中一个条件应该为假。

编辑

这是可标记的表格

+----+----------+--------------+----------------+-----------+
| id | label_id | labelable_id | labelable_type | junior_id |
+----+----------+--------------+----------------+-----------+
|  1 |        1 |          925 | Etude          |         1 |
|  2 |        2 |          926 | Etude          |         1 |
|  3 |        3 |          927 | Etude          |         1 |
|  4 |        2 |          927 | Etude          |         1 |
|  5 |        1 |          928 | Etude          |         1 |
|  6 |        2 |          928 | Etude          |         1 |
|  7 |        3 |          929 | Etude          |         1 |
|  8 |        2 |          931 | Etude          |         1 |
|  9 |        1 |          933 | Etude          |         1 |
| 10 |        2 |          934 | Etude          |         1 |
| 11 |        4 |            1 | User           |         1 |
| 12 |        5 |            2 | User           |         1 |
| 13 |        7 |            1 | Entreprise     |         1 |
| 14 |        6 |            2 | Entreprise     |         1 |
| 15 |        7 |            3 | Entreprise     |         1 |
| 16 |        8 |            4 | Entreprise     |         1 |
| 17 |        6 |            5 | Entreprise     |         1 |
| 18 |        7 |            6 | Entreprise     |         1 |
| 19 |        6 |            7 | Entreprise     |         1 |
+----+----------+--------------+----------------+-----------+

如你所见,问题可能是它们是两个labelable_id为1的实体,以及两个labelable_id为2的实体。但这是一个morphToMany,所以Eloquent应该知道用户上的标签不应该被考虑进去帐户?

当我查看生成的 SQL 时:

 select * from `entreprises` 
     where `entreprises`.`deleted_at` is null
     and `entreprises`.`junior_id` = ? 
     and (select count(*) from `labels` 
          inner join `labelables` on `labels`.`id` = `labelables`.`label_id` 
          where `labels`.`deleted_at` is null 
          and `labels`.`junior_id` = ? 
          and `labelables`.`labelable_id` = `entreprises`.`id` 
          and `hidden` != ?
          and `hidden` = ?
          and `labels`.`deleted_at` is null
          and `labels`.`junior_id` = ?) >= ?

似乎没有考虑 labelables.labelable_type,所以这可能是问题的根源。

最佳答案

虽然我不知道问题是什么,但我敢打赌你实际上得到了正确的答案,而你的期望是不正确的。

你的第二个例子只有一个 whereHas 显然不会返回任何行,因为条件永远无法满足。

但是,首先,我想您的理解是有缺陷的。生成的查询反射(reflect)了您使用两个 whereHas 子句指定的内容。它将找到至少有一个隐藏标签和至少一个未隐藏标签的所有企业。由于这是一个多对多的关系,这实际上是可满足的。

请注意,这与第二个示例不同,在第二个示例中,您搜索至少有一个标签既隐藏又未隐藏的所有企业。

我不知道enterprises表,也不知道many-many join表,但我猜这两个结果实际上满足我上面所说的条件。您的数据库引擎可能不会撒谎。如果您不这么认为并且感觉生成的查询实际上是错误的,请告诉我们您认为错误的地方。

关于php - Laravel WhereHas 与多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744377/

有关php - Laravel WhereHas 与多态关系的更多相关文章

  1. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  2. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  3. ruby-on-rails - rails 多态关联(遗留数据库) - 2

    我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint

  4. ruby - Rails 组合多个 activerecord 关系 - 2

    我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代

  5. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. ruby-on-rails - Ruby/Rails - 检查 HABTM 关系记录中是否存在子 ID - 2

    我有一组名为Tasks和Posts的资源,它们之间存在has_and_belongs_to_many(HABTM)关系。还有一个连接它们的值的连接表。create_table'posts_tasks',:id=>falsedo|t|t.column:post_id,:integert.column:task_id,:integerend所以我的问题是如何检查特定任务的ID是否存在于从@post.tasks创建的数组中?irb(main):011:0>@post=Post.find(1)=>#@post.tasks=>[#,#]所以我的问题是,@post.tasks中是否存在"@task

  8. Ruby On Rails 模型、 View 和 Controller 之间的关系 - 2

    根据我目前的理解,如果我必须描述Rails应用程序的各个组件如何协同工作以响应请求,我会说以下内容:1)路由确定哪些请求URL映射到哪些Controller方法。2)Controller方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的View模板。3)View模板使用存储在全局变量中的数据来构造最终响应。在上面的解释中,几个组件之间的关系是明确的,不可否认的;即:1)路由和Controller方法2)Controller方法和View模板其实上面的关系是一对一的。但是,模型类与其相邻组件类型(即Controller)的关系并不明确。是的,Controller从模型中检索信

  9. ruby - ActiveRecord,通过多态属性查找 - 2

    有这个:classEventtrueenduser=User.create!我可以:Event.create!(:historizable=>user)但我不能:Event.where(:historizable=>user)#Mysql2::Error:Unknowncolumn'events.historizable'in'whereclause'我必须改为这样做:Event.where(:historizable_id=>user.id,:historizable_type=>user.class.name)更新重现问题的代码:https://gist.github.com/fg

  10. ruby-on-rails - 本地 gem 的“bundle 安装”没有解决依赖关系,而 'gem install' 可以 - 2

    我在目录“/home/enterprise/pkg”中有一个本地gem(enterprise-0.0.1.gem)。它依赖于active_directorygem(v1.5.5),这是在它的enterprise.gemspec文件中指定的,如下所示:-gem.add_dependency("active_directory")在我的应用程序的Gemfile中,我添加了以下行:-gem'enterprise','0.0.1',path=>'/home/enterprise/pkg'当我做的时候bundleinstall在我的应用程序的源目录中,只安装了企业gem。因此,我遇到了引用act

随机推荐