0

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

除了这一部分之外,一切都很好,我在浏览完文档后还没有弄清楚。

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

$runs = Run::with('times')->where('user_id', $user->id)->get();

我在这里缺少什么吗?这是我的数据库结构和模型关系:

目前的数据库结构:


用户:

ID

姓名


运行:

ID

姓名


时间:

ID

时间

用户身份

run_id


模型:

用户:

public function times()
{
    return $this->hasMany(Time::class);
}

跑:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Run extends Model
{    
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function times()
    {
        return $this->hasMany(Time::class);
    }
}

时间:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Time extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function run()
    {
        return $this->belongsTo(Run::class);
    }

}
4

2 回答 2

2

Run 没有 user_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();

编辑:

Runs 和 Users 之间的关系实际上是多对多的关系,Times 是一个枢纽模型。Laravel 支持这种类型的排列,所以让我们设置它。

use Illuminate\Database\Eloquent\Relations\Pivot;

class Time extends Pivot
{
     public function run()
     {
         return $this->belongsTo('\App\Run');
     }

    public function user()
    {
         return $this->belongsTo('\App\User');
    }
}
class User extends Model
{
    public function times()
    {
        return $this->hasMany('\App\Time');
    }

    public function runs()
    {
        return $this->belongsToMany('\App\Run')->using('\App\Time');
    }
}
class Run extends Model
{
    public function times()
    {
        return $this->hasMany('\App\Time');
    }

    public function users()
    {
        return $this->belongsToMany('\App\User')->using('\App\Time');
    }
}

所以现在您可以查询特定用户的所有运行,并且因为它使用时间作为数据透视表,所以您知道用户将有时间返回所有运行

User::find(1)->runs();

参与跑步的所有用户

Run::find(1)->users();
于 2019-12-18T20:01:53.340 回答
0

重新阅读您的要求:

用户一个 TIME (...)

您需要用于has('times')加载Run存在关系的记录。with() 不限制查询,它只急切加载关系:

$runs = Run::has('times')->with('times')->where('user_id', $user->id)->get();

注意:您可以同时使用has()with()在单个查询中来约束父模型并急切加载关系以便以后使用。

编辑: 可能有问题->where('user_id', $user->id);,但如果你已经有$user,你可以直接查询:

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

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

于 2019-12-18T20:01:09.290 回答