为什么Laravel不返回特定用户的关系记录(它返回所有用户的记录)?

时间:2019-03-10 06:23:01

标签: php mysql laravel eloquent laravel-5.7

这是一个非常奇怪的情况。我不知道这是我的理解上的问题还是Laravel Eloquent ORM中的错误。但是,这就是正在发生的事情。

我有一个叫users的表,另一个叫user_metas。一个表显然包含所有用户数据,而另一个表(user_metas)具有4列,如下所示。

  • id
  • user_id
  • 名称

现在,此表中有4条记录我要为特定用户获取。它们如下。

  • name => region_name
  • name => region_code
  • name => country_name
  • 名称=>国家/地区代码

我分别在hasManybelongsTo中定义了一种User.phpUserMeta.php关系。这就是我试图从user_metas表中获取上述给定行的方式。

$user->meta()->where('name','like','region%')->orWhere('name','like','country%')->pluck('value','name');

问题是,即使我仅请求特定用户的数据,它也会从整个怪胎表中返回与region%country%匹配的所有记录!它应该自动过滤掉其他记录!

我不知道怎么了。也许我误解了该功能,或者Eloquent ORM出现了问题。谁能在这里传播一些知识?

更新:使用toSql函数,我发现它直接使用条件而不是对条件进行分组。这意味着条件是这样的user_id = ? AND name = ? OR name = ?而不是user_id = ? AND (name = ? or name = ?)

1 个答案:

答案 0 :(得分:3)

最后,我知道了!我唯一要做的就是将闭包传递给where函数并写下条件。这是我的旧代码和正在运行的新代码。

旧代码:

$user->meta()->where('name','like','region%')->orWhere('name','like','country%')->pluck('value','name');

新代码:

$user->meta()->where(function($q){
     $q->where('name','like','country%')
       ->orWhere('name','like','region%');
})->pluck('value','name');

事情按我想要的方式解决了! Laravel总是有完美的解决方案!