Laravel with 模型关联 被关联的模型不存在

laravel 模型关联中使用with。场景如下:查询用户的资金流水记录。用流水表 stream 作为主表,user_id 字段于与user 表关联。

Stream::query()->with(['user' => function( $query ) use ($userName) {
    $query->where('name', $userName);
}]);

我想查询某个用户的资金流水,但是这样查出来的还是所有的流水,用户名没匹配的则user字段为一个空数组。我想要的是用户名不匹配的流水也不要查不出,只查出于用户名对应的流水记录。希望各位大佬,给出提示和意见,谢谢。

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

就是 with + whereHas,不过论坛有个帖子说 whereHas 有性能问题

问答:whereHas 有缺陷,会把主表全都遍历一遍

4年前 评论
讨论数量: 8
whereHas('user', function($q) use( $userName)
{
    $q->where('name',  $userName);
})
4年前 评论
_love1992 (楼主) 4年前
Stream::with(['user' => function( $query ) use ($userName) {
    return $query->where('name', $userName);
}])

主要是with直接加在模型后面,然后闭包里的查询加了一个 return

4年前 评论
_love1992 (楼主) 4年前
captain2021 (作者) 4年前
_love1992 (楼主) 4年前
巴啦啦

我一般是在 model 里写关联关系的,例如在 mode l里写一个关联方法 test(....),在调用的时候,Stream::with('test')...... 。不知道这个是否满足你的需求。

4年前 评论
Complicated

whereHas是最正规的方式,你去了解一下用法就好了,这里就不多说了

4年前 评论

Stream::query()->with('user')->whereHas('user',function($query){
...........
});
这样既可以加载关联关联,又可以查询!

4年前 评论

一个 whereHas 加一个 with 吧!

4年前 评论

就是 with + whereHas,不过论坛有个帖子说 whereHas 有性能问题

问答:whereHas 有缺陷,会把主表全都遍历一遍

4年前 评论
/**
 * 定义关联关系
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function user()
{
    return $this->hasMany('user', 'cid', 'id');
}

public function demo()
{
    Model::query()
        ->with('user')
        ->whereHas('user', function ($query) use ($name) {
            $query->where('name', $name);
    });
}

试试这个??

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!