【问题标题】:Laravel foreach Looping Returns Weird ResultLaravel foreach 循环返回奇怪的结果
【发布时间】:2017-12-04 13:44:14
【问题描述】:

当我循环一个结果集时,我遇到了一个问题,其中包含我正在 foreach 的关系。

这是目前的代码:

<?php

$deadlines = App\Deadlines::where('beginDatum', '<=', date("Y-m-d"))
    ->where('eindDatum', '>=', date("Y-m-d"))
    ->first();

$totalActivities = App\UserActivity::where('userid', Auth::id())
    ->where('deadline', '=', $deadlines->id)
    ->count();

if($totalActivities > 0) {
    $activiteiten = \App\User::find(Auth::id());
    foreach ($activiteiten->useractivities as $user_activity) {
        if ($deadlines->id == $user_activity->deadline) {
            print_r("<div class='col-md-4'><input type='text' value='$user_activity->datum' class='form-control'></div>");
            foreach ($user_activity->activity as $activity) {
                print_r("<div class='col-md-7'><input type='text' value='$activity->activiteit' class='form-control'></div>");
            }
            print_r("<div class='col-md-1'><input type='submit' class='btn btn-primary' value='Edit'></div>");
        }
    }
} else {
?>

<br/>U heeft nog geen activiteiten toegevoegd!

<?php
}

但是当 'user_activity' 表中存在重复的 'activityid' 时,它会出现一些奇怪的行为。比如……

|--------------------------------------|
|  date     |  userid     | activityid |
|--------------------------------------|
| 2017-12-28| 1           | 1          |
| 2017-11-30| 1           | 1          |
|--------------------------------------|

它有两个相同的activityid,所以活动名称相同,但我不知道为什么它只显示重复活动的日期。当只有一个 activityid 条目时,它显示得很好: https://gyazo.com/11cc6828f97e7a191bf40c8b74448e83

【问题讨论】:

  • 呃……从哪里开始……
  • 假设这些是 Eloquent 模型,您不应该在用户活动和截止日期之间使用多对多关系吗?
  • 你为什么要做$deadlines = App\Deadlines而不是在命名空间下添加这些然后只运行$deadlines = Deadlines::where()
  • 不是关于截止日期,而是关于活动
  • Laracasts 也是了解更多信息的好地方。

标签: php laravel foreach


【解决方案1】:

对于这种查询,您应该使用 Laravel Eloquent 多对多关系。

假设您使用的是 Laravel 5.5,此文档条目将有所帮助:

https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

基本上,在您的模型定义中,您应该设置关系。例如,在 Deadline 模型的定义中,您将有如下内容:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Deadline extends Model
{
    /**
     * The activities associated with this deadline
     */
    public function activities()
    {
        return $this->belongsToMany('App\UserActivity');
    }
}

如果您为所有相关模型设置了此设置,那么您可以执行以下操作:

$user = App\User::findOrFail(Auth::id());
$today = date("Y-m-d");

$activities = $user->activities->whereHas('deadlines', function ($query) {
    $query->where('beginDatum', '<=', $today)->where('eindDatum', '>=', $today;
})->get();

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 2017-03-10
    • 2014-05-27
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多