Laravel-根据子关联获取父数据

Laravel-根据子关联获取父数据,laravel,laravel-5,eloquent,eloquent-relationship,laravel-6.2,Laravel,Laravel 5,Eloquent,Eloquent Relationship,Laravel 6.2,我试图列出用户有时间的所有跑步(将跑步视为比赛)。用户不会总是运行,因此不会总是有时间 除了这一部分,所有的工作都很好,在看完文档后,我还没有弄清楚这一部分 目前我正在尝试以下操作,但它不会生成任何用户,只是一个空数组: $runs = Run::with('times')->where('user_id', $user->id)->get(); 这里有我遗漏的东西吗?以下是我的数据库结构和模型关系: 目前的数据库结构: 用户: id 名称 运行: id 名称 时代:

我试图列出用户有时间的所有跑步(将跑步视为比赛)。用户不会总是运行,因此不会总是有时间

除了这一部分,所有的工作都很好,在看完文档后,我还没有弄清楚这一部分

目前我正在尝试以下操作,但它不会生成任何用户,只是一个空数组:

$runs = Run::with('times')->where('user_id', $user->id)->get();
这里有我遗漏的东西吗?以下是我的数据库结构和模型关系:

目前的数据库结构:


用户:

id

名称


运行:

id

名称


时代:

id

时间

用户id

运行\u id


模型:

用户:

运行:


重新阅读您的要求:

“其中用户有一个时间(…)”

您需要使用
has('times')
在存在关系的地方加载
Run
记录
with()
不约束查询,它只加载关系:

$runs = Run::has('times')->with('times')->where('user_id', $user->id)->get();
注意:您可以在单个查询中同时使用
has()
with()
,以约束父模型并加载关系以便于以后使用

编辑:
->where('user\u id',$user->id)可能存在问题
,但如果您已经有
$user
,您可以直接查询:

$runs = $user->runs()->has('times')->with('times')->get();

注意:这假设您的关系正确形成,但不清楚
用户
运行
时间
是如何连接的。如评论中所述,数据库结构目前不支持建议的逻辑。

请重新阅读您的要求:

“其中用户有一个时间(…)”

您需要使用
has('times')
在存在关系的地方加载
Run
记录
with()
不约束查询,它只加载关系:

$runs = Run::has('times')->with('times')->where('user_id', $user->id)->get();
注意:您可以在单个查询中同时使用
has()
with()
,以约束父模型并加载关系以便于以后使用

编辑:
->where('user\u id',$user->id)可能存在问题
,但如果您已经有
$user
,您可以直接查询:

$runs = $user->runs()->has('times')->with('times')->get();

注意:这假设您的关系正确形成,但不清楚
用户
运行
时间
是如何连接的。如评论中所述,数据库结构目前不支持建议的逻辑。

Run没有用户id列,我相信whereHas是您在这里想要的,因为您试图只获得某个用户有时间的运行,而不是所有运行都只有该用户的时间

$runs = Run::whereHas('times', function ($builder) use ($user) { 
        $query->where('user_id', $user->id);
    })->get();
此外,如果您希望立即加载该用户和仅该用户的时间,则可以添加约束时间

$runs = Run::whereHas('times', function ($builder) use ($user) { 
        $query->where('user_id', $user->id);
    })->with(['times' => function ($query) use ($user) {
        $query->where('user_id', $user->id);
    }])->get();
编辑:

运行和用户之间的关系实际上是一种多对多的关系,时间充当一个轴心模型。Laravel支持这种类型的安排,所以让我们设置它

使用illumb\Database\elount\Relations\Pivot;
上课时间延长
{
公共功能运行()
{
返回$this->belongsTo('\App\Run');
}
公共函数用户()
{
返回$this->belongsTo('\App\User');
}
}
类用户扩展模型
{
公共活动时间()
{
返回$this->hasMany('\App\Time');
}
公共功能运行()
{
使用('\App\Time')返回$this->belongstomy('\App\Run')->;
}
}
类运行扩展模型
{
公共活动时间()
{
返回$this->hasMany('\App\Time');
}
公共功能用户()
{
使用('\App\Time')返回$this->belongstomy('\App\User')->;
}
}
因此,现在您可以查询特定用户的所有运行,因为它使用时间作为数据透视表,您知道用户将有一个时间来处理它返回的所有运行

User::find(1)->runs();
参与跑步的所有用户

Run::find(1)->users();

Run没有user\u id列,我相信whereHas就是您在这里想要的,因为您试图只获取某个用户有时间的运行,而不是所有运行都只包含该用户的时间

$runs = Run::whereHas('times', function ($builder) use ($user) { 
        $query->where('user_id', $user->id);
    })->get();
此外,如果您希望立即加载该用户和仅该用户的时间,则可以添加约束时间

$runs = Run::whereHas('times', function ($builder) use ($user) { 
        $query->where('user_id', $user->id);
    })->with(['times' => function ($query) use ($user) {
        $query->where('user_id', $user->id);
    }])->get();
编辑:

运行和用户之间的关系实际上是一种多对多的关系,时间充当一个轴心模型。Laravel支持这种类型的安排,所以让我们设置它

使用illumb\Database\elount\Relations\Pivot;
上课时间延长
{
公共功能运行()
{
返回$this->belongsTo('\App\Run');
}
公共函数用户()
{
返回$this->belongsTo('\App\User');
}
}
类用户扩展模型
{
公共活动时间()
{
返回$this->hasMany('\App\Time');
}
公共功能运行()
{
使用('\App\Time')返回$this->belongstomy('\App\Run')->;
}
}
类运行扩展模型
{
公共活动时间()
{
返回$this->hasMany('\App\Time');
}
公共功能用户()
{
使用('\App\Time')返回$this->belongstomy('\App\User')->;
}
}
因此,现在您可以查询特定用户的所有运行,因为它使用时间作为数据透视表,您知道用户将有一个时间来处理它返回的所有运行

User::find(1)->runs();
参与跑步的所有用户

Run::find(1)->users();

这似乎是不对的,单独使用has()只会查找所有有时间的运行,而->此处应该应用于运行()的时间是基于文档的。我认为Where has()可能是这里的解决方案你可能是对的
whereHas()
has()的扩展<