【问题标题】:laravel Eloquent Relationship query with whereHaslaravel Eloquent 关系查询与 whereHas
【发布时间】:2021-05-25 03:22:12
【问题描述】:

下面有两张表

用户:

id name email
1 abc abc@...
2 xyz xyz@...
3 abx abx@...

书籍:

id user_name book price
1 abc:x1 book1 10
2 xyz:x2 book1 20
3 abc:x5 book3 30
4 ab:x2 book1 10

如果您注意到我的第二个表字段 user_name 有用户表的用户名加上 :x 和数字

也许这没有意义,但这是我的项目要求

现在,当我想用​​书籍查询某些用户时,例如如果我搜索 ID 为 (1) 的用户 由于 user_name,它应该给我 1 和 3 的记录

我试过了

$user = USER::with('books')
          whereHas('books', function ($query) {
             $query->where('user_name', 'like', 'name:%');
})->get();

我也试过了

USER::with('books')
    ->whereHas('books', function ($query) use ($name) {
       $query->where('user_name', 'like', $name . ':%');
     })  

也不行。

还有如何在 :x 之后获得第三个额外的列值

另外,是否可以在模型中编写此查询?

谢谢

【问题讨论】:

  • 请发布用户模型(尤其是书籍关系)
  • 关系在用户模型中如下所示 public function books() { return $this->hasMany(Books::class,'user_name','name'); }
  • 关系很好,因为我可以用精确的数学查询记录
  • 你确定吗?如果两列之间没有完全匹配,mysql 关系就无法工作,所以你正在做的事情不能使用关系来建模
  • 您可以做的是在模型中创建一个范围,并在那里进行查询,但您无法访问您可以对关系执行的所有操作

标签: laravel eloquent


【解决方案1】:

我建议您始终将规范化的数据存储在数据库中,而不管数据的表示层如何。可以在查询级别或在应用程序本身中将数据转换为您想要的形式。

所以你应该在你的 books 表中引入 2 列

  • user_id
  • 序列

喜欢


id user_id sequence book price
1 1 1 book1 10
2 2 2 book1 20
3 1 5 book3 30
4 3 2 book1 10

通过这种方式,您可以轻松过滤掉用​​户,也可以对用户书应用过滤器。要构造用户名,您可以使用accessor 和图书模型中的虚拟属性,它将为您构建用户名,喜欢

class Book extends Model
{
    protected $appends = ['user_name'];

    protected $with = ['user'];
   
    public function getUserNameAttribute()
    {
        return $this->user->name .":x". $this->sequence;
    }

    public function user()
    {
        return $this->belongsTo(User::class, 'id', 'user_id');
    }
}

$appends 将保存模型的自定义属性,访问器方法将使用 user() 关系构造用户名。因此,如果您加载书籍,那么您还应该渴望相关用户,以便在访问器中 $this->user->name 将具有来自用户表的名称,否则它将为空,为此您可以在模型中使用 $with 属性,这将亲密每当加载书籍时,都应该加载该相关用户。

现在您可以获取具有特定 id 的用户

User::with('books')->find(1);

或者用户名的书

Book::whereHas('user', function ($query) use ($name) {
       $query->where('name', 'like', $name);
     });

或者按用户名和x后面的数字是序列的书

Book::whereHas('user', function ($query) use ($name, $sequence) {
       $query->where('name', 'like', $name);
     })->where('sequence', $sequence);

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2022-08-19
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2013-10-03
    • 2017-07-19
    • 2021-05-28
    相关资源
    最近更新 更多