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()的扩展<