【问题标题】:Laravel Multiple Models Eloquent Relationships Setup?Laravel 多个模型雄辩的关系设置?
【发布时间】:2016-01-11 19:38:05
【问题描述】:

我有 3 个模型

User Pick Schedule

我正在尝试执行以下操作

$picksWhereGameStarted = User::find($user->id)
                                ->picks()
                                    ->where('week', $currentWeek)
                                    ->first()
                                ->schedule()
                                    ->where('gameTime', '<', Carbon::now())
                                    ->get();

此代码仅返回集合内的一个数组。如果有超过 1 个结果,我希望它返回超过 1 个数组。

我可以将-&gt;first() 替换为允许我返回超过 1 个结果的其他内容吗?

如果不是,我该如何设置我的模型关系以使其正常工作。

我的模型目前设置如下。

用户模型

public function picks()
{
    return $this->hasMany('App\Pick');
}

调度模型

public function picks()
{
    return $this->hasMany('App\Pick');
}

选择模型

public function user()
{
    return $this->belongsTo('App\User');
}

public function schedule()
{
    return $this->belongsTo('App\Schedule');
}

【问题讨论】:

  • 你的变量是$picksWhereGameStarted,所以你想得到Picks?在您的代码中,您试图获取Users。请澄清。
  • 我正在尝试获取Picks。我正在尝试做这样的事情。从User 获取所有Picks,x id 是游戏开始的地方。因此,在users table 中查找id 列然后获取所有选择,然后在schedules table 中查找gameTime 列以查看游戏是否已经开始。

标签: php laravel eloquent relationship laravel-5.1


【解决方案1】:

由于您已经有一个User 模型(您在内部使用了find 方法作为$user-&gt;id),您可以只加载它的Pick 关系并加载那些Picks'Schedule,如下所示:

编辑: 假设您有一个schedules 表并且您的picks 表有一个schedule_id 列。尝试这个。

$user->load(['picks' => function ($q) use ($currentWeek) {
    $q->join('schedules', 'picks.schedule_id', '=', 'schedules.id')
        ->where('schedules.gameTime', '<', Carbon::now()) // or Carbon::now()->format('Y-m-d'). See what works.
        ->where('picks.week', $currentWeek);
}])->load('picks.schedule');

编辑:上面的代码应该返回userpicks,它有一个schedules.gameTime &lt; Carbon::now()

尝试转储$user 对象以查看加载的关系。这就是您想要的 Eloquent 方式。

提示:您可能需要在转储$user 之前执行$user-&gt;toArray() 以更好地查看数据。

编辑: 加载的picks 将采用Collections 的形式,因此您必须使用循环访问它。请尝试以下操作:

foreach ($user->picks as $pick) {
    echo $pick->schedule->gameTime;
}

如果你只想要用户的第一个pick,你可以这样做:$user-&gt;picks-&gt;first()-&gt;schedule-&gt;gameTime

【讨论】:

  • 我想做这样的事情 dd($user-&gt;picks()-&gt;schedule()-&gt;gamesStarted()); 但我得到了一个 BadMethodCallException 但如果我这样做 dd($user-&gt;picks()-&gt;first()-&gt;schedule()-&gt;gamesStarted()); 有效,但这不是我想要的。我需要比赛开始的所有选择,而不仅仅是第一个结果。
  • 为什么要使用first() 方法?它只会返回picksCollection 中的第一个元素。 gamesStarted() 方法是Schedule 模型中的真实方法吗?或者它是您schedules 表中的一个字段?
【解决方案2】:

我认为 foreach 循环可能是您正在寻找的:

$picks = User::find($user->id)->picks()->where('week', $currentWeek);
foreach ($picks as $pick){
    $pickWhereGameStarted = $pick->schedule()->where('gameTime', '<', Carbon::now())->get();
}

试试这个,看看它是否适合你

【讨论】:

  • 我可以做到这一点,但我希望我能通过 Eloquent 关系做到这一点。我希望能够运行除 -&gt;get() 之外的其他功能,例如 -&gt;count(),这就是我寻找 Eloquent 解决方案的原因。
猜你喜欢
  • 2016-11-26
  • 2019-02-12
  • 1970-01-01
  • 2013-06-04
  • 2018-02-19
  • 2017-10-17
  • 2019-07-16
  • 2021-01-27
相关资源
最近更新 更多