【问题标题】:Why Laravel is not returning the relationship records of a specific user (It returns records of all the users)?为什么 Laravel 不返回特定用户的关系记录(它返回所有用户的记录)?
【发布时间】:2019-03-10 06:23:01
【问题描述】:

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

我有一张名为users 的桌子和另一张名为user_metas 的桌子。一张表显然包含所有用户数据,另一张表(user_metas)有 4 列,如下所示。

  • 身份证
  • user_id
  • 姓名
  • 价值

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

  • name => region_name
  • name => region_code
  • name => 国家/地区名称
  • name => country_code

我在User.phpUserMeta.php 中分别定义了hasManybelongsTo 关系。这就是我尝试从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 = ?)

【问题讨论】:

    标签: php mysql laravel eloquent laravel-5.7


    【解决方案1】:

    我终于明白了!我唯一要做的就是将一个闭包传递给 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 总是有完美的解决方案!

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 2016-11-01
      • 2021-12-04
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多