【问题标题】:laravel query returns weird orderlaravel 查询返回奇怪的顺序
【发布时间】:2015-12-17 00:49:06
【问题描述】:

所以我在“bugoverview”页面中遇到了一个bug。 (多讽刺).. 在从数据库中删除一个错误(id : 7 已删除)后,我才知道这种奇怪的排序方式

无论如何,问题如图所示:

我在一个简单的刀片 foreach 中获取所有行。

我的查询代码是:

$bugs_all = Bug::with('klant','user')->orderBy('id','asc')->get();

$projects_all = Project::all();

我的 foreach 代码:

@foreach($projects_all as $project)
    @foreach($bugs_all as $bug)
        @if(count($bugs_all) > 0)
            @if($bug->project_id == $project->id)
                <tr>
                    <td>{{$bug->id}}</td>
                    <td>{{substr($bug->titel,0,15)}}...</td>
                    <td>{{$bug->status}}</td>
                    <td>{{$bug->soort}}</td>
                    <td>
                        @if($bug->prioriteit == 'laag')
                            <span class="label label-success">Laag</span>
                        @elseif($bug->prioriteit == 'gemiddeld')
                            <span class="label label-warning">Gemmideld</span>
                        @elseif($bug->prioriteit == 'hoog')
                            <span class="label label-danger">Hoog</span>
                        @elseif($bug->prioriteit == 'kritisch')
                            <span class="label label-purple">Kritisch</span>
                        @else
                            <span class="label label-info">Geen prioriteit</span>
                        @endif
                    </td>
                    <td>{{date('d-m-y - H:i',strtotime($bug->eind_datum))}}</td>
                    @if($bug->klant)
                        <td>{{$bug->klant->voornaam .' '.$bug->klant->tussenvoegsel.' '. $bug->klant->achternaam}}</td>
                    @endif
                    <td>{{$project->projectnaam}}</td>
                    @if($bug->user)
                        <td>{{$bug->user->voornaam .' '.$bug->user->tussenvoegsel.' '. $bug->user->achternaam}}</td>
                    @else
                        <td>Geen</td>
                    @endif
                    <td>
                        <a href="/bugchat/{{$bug->id}}" class="">
                            <button type="submit" class="btn btn-success btn-xs">
                                <i class="glyphicon glyphicon-search"></i>
                            </button>
                        </a>
                    </td>
                </tr>
            @endif

        @endif
    @endforeach
@endforeach

【问题讨论】:

  • 您发布的是否是单个项目的错误编号...?
  • 不,这些是通过 mysql 排序的 5 行。@BasheerAhmed
  • dd($bugs_all->toArray()) 在控制器中查看顺序?
  • 那说明你的项目没有升序
  • 如果你的表是 InnoDB - InnoDB 是一个重用空间的引擎。您创建记录 1、2 和 3。然后您删除记录 2 并创建记录 4,默认顺序是 Id ASC 如下:1、4、3 - 因为记录 4 替换了记录 2 的空间。我会说这是因为你没有正确排序关系,使用 Eloquent 你也可以在关系上使用orderBy

标签: php laravel laravel-5.1


【解决方案1】:

您的问题是,您有一个遍历不同项目的外循环。由于每个错误都与不同的项目相关联,因此您对项目 ID 的检查会“破坏”错误的顺序。在您的代码中,错误是按项目排序的......

但你甚至不需要那个外循环。如果您在错误模型中定义 belongsTo 关系,您可以简单地访问错误,例如:

@foreach($bugs_all as $bug) 
   $bug->project->projectnaam;
   .... 
@endforeach

这样您就掌握了有关错误项目的所有信息并保持您定义的顺序。

【讨论】:

    【解决方案2】:

    这个问题包含一些歧义,如果没有看到 ERD 或您的表/关系结构,很难真正提供帮助。

    但是,我假设您使用的是 InnoDB,并且您的关系排序不正确。

    首先,InnoDB 是一个可以重复使用已删除空间的引擎。例如:您创建记录 1、2 和 3。然后删除记录 2 并创建记录 4。默认顺序是 auto_increment 升序(这不是由 idASC 明确排序的)。

    话虽如此,您的错误顺序如下:1、4、3 - 这只是因为记录 4 替换了记录 2 的空间(之前已删除)。

    其次,我只是建议您正确设置您的关系。我假设您的项目以某种方式与错误有关?以下几行就足够了:

    // Inside your Project model.
    public function bugs()
    {
        return $this->hasMany('App\Bug', 'bug_id', 'id')
                    ->orderBy('id', 'ASC');
    }
    
    // Inside your Bug model.
    public function project()
    {
        return $this->belongsTo('App\Project', 'bug_id', 'id');
    }
    

    要获取所有项目的所有错误:

    $projects = Project::with('bug.klant', 'bug.user')->all();
    

    在刀片模板中,您可以执行以下操作:

    @foreach ($project->bugs as $bug)
    
        {{ $bug->user }}
        {{ $bug->klant }}
    
    @endforeach
    

    【讨论】:

    • 有点不同,但我得到了它的工作谢谢,
    • 问题根本不在于数据库引擎和自动增量;)只是通过项目的外循环导致了问题。但不管怎么说。好答案;)
    • @shock_gone_wild 当然,在这种情况下不是问题,但有关 InnoDB 引擎的信息可能对遇到类似问题的人有所帮助。
    • 是的,绝对是 ;)
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2012-04-17
    • 2016-12-16
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多