当前位置: 首页 > 知识库问答 >
问题:

简化blade和laravel中的@foreach/if

段干麒
2023-03-14

我对laravel(特别是L5)相当陌生,我正在制作我自己版本的todo应用程序,而不是按照那里的某个教程去做。到目前为止,我已经学到了很多东西,但是我现在在刀片模板中展示的这段代码让我觉得它们可能是一种更简单的方法。

我的 fn是

public function index()
{
    $todos = Todo::get();
    return view('todos', compact('todos'));
}

扩展了一个 模型,使数据处理变得非常容易!

我的路线是:

Route::bind('todos', function($slug)
{
    return App\Todo::whereSlug($slug)->first();
});

所以我的页面只是显示了一个无序的“TODOS”列表。我想要两份单独的名单。一个用于完成的待办事项,一个用于未完成的待办事项。我的刀片模板到目前为止看起来是这样的,看起来有点凌乱。同时,我也循环了两次结果,这是我认为我可以改进的地方。

<h3>Incomplete</h3>
<ul>
    @foreach ($todos as $todo)
        @if ($todo->completed == 'No')
            <li>
                <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
            </li>
        @endif
    @endforeach
</ul>

<h3>Complete</h3>
<ul>
    @foreach ($todos as $todo)
        @if ($todo->completed == 'Yes')
            <li>
                <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
            </li>
        @endif
    @endforeach
</ul>

有什么建议可以简化刀片模板吗?

共有2个答案

乌杰
2023-03-14

只是有点简化但是。。。

您可以在控制器中尝试:

public function index()
{
    $completed = Todo::where('completed','Yes')->get();
    $incompleted = Todo::where('completed','No')->get();
    return view('todos', compact('completed', 'incompleted'));
}

在您的模板中:

<h3>Incomplete</h3>
<ul>
    @foreach ($incompleted as $todo)
            <li>
                <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
            </li>
    @endforeach
</ul>

<h3>Complete</h3>
<ul>
    @foreach ($completed as $todo)
            <li>
                <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
            </li>
    @endforeach
</ul>

另一种使用子模板的方法如下所示:

    //_list_todos.blade.php

    @foreach ($todos as $todo)
            <li>
                <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
            </li>
    @endforeach

您的主模板如下所示:

<h3>Incomplete</h3>
<ul>
     @include('_list_todos',['todos'=>$incompleted] )
</ul>

<h3>Complete</h3>
<ul>
     @include('_list_todos',['todos'=>$completed] )
</ul>

使用类似于最后一个子模板的优点是可以重用代码,并简化主模板。

黄景胜
2023-03-14

把你的代码弄干。您可以通过将实际项目标记向上移动到部分模板来简化它,因为它在完整列表和不完整列表中都是重复的:

<h3>Incomplete</h3>
<ul>
    @foreach ($todos as $todo)
        @if ($todo->completed == 'No')
            @include('partials.items.todo')
        @endif
    @endforeach
</ul>

<h3>Complete</h3>
<ul>
    @foreach ($todos as $todo)
        @if ($todo->completed == 'Yes')
            @include('partials.items.todo')
        @endif
    @endforeach
</ul>

如下所示:

<li>
    <a href="{{ route('todos.show', [$todo->slug]) }}">{{ $todo->title }}</a>
</li>

我也会重新考虑你的循环。您可以在控制器中拆分它们,而不是在同一个列表上循环两次:

public function index()
{
    $todos = Todo::where('user_id', '=', Auth::id())->get();

    $complete = $todos->filter(function ($item) {
        return $item->completed = 'Yes';
    });

    $incomplete = $todos->filter(function ($item) {
        return $item->completed = 'No';
    });

    return view('todos', compact('complete', 'incomplete'));
}

查看您的 模型,Id还使数据库中的 列成为布尔字段,而不是包含yes或no字符串的列。然后可以将该列值强制转换为正确的布尔值(因为MySQL没有本机布尔字段类型):

class Todo extends Model
{
    protected $casts = [
        'completed' => 'boolean',
    ];

    public function isComplete()
    {
        return $this->completed;
    }
}

然后重新考虑控制器操作以使用以下方式:

public function index()
{
    $todos = Todo::where('user_id', '=', Auth::id())->get();

    $complete = $todos->filter(function ($item) {
        return $item->isComplete() === true;
    });

    $incomplete = $todos->filter(function ($item) {
        return $item->isComplete() === false;
    });

    return view('todos', compact('complete', 'incomplete'));
}

您甚至可以将这些集合筛选器移动到自定义的 类:

use Illuminate\Database\Eloquent\Collection as EloquentCollection;

class TodoCollection extends EloquentCollection
{
    public function complete()
    {
        return $this->filter(function ($item) {
            return $item->isComplete() === true;
        });
    }

    public function incomplete()
    {
        return $this->filter(function ($item) {
            return $item->isComplete() === false;
        });
    }
}

对于冗长的回复,很抱歉,但是应该给您提供一些关于如何重新考虑您的代码的食物。

 类似资料:
  • Laravel Blade Directives A collection of nice Laravel Blade directives. Installation You can install the package via composer: composer require appstract/laravel-blade-directives Usage @istrue Only sh

  • blade 意为利刃,刀剑;在中国冷兵器中刀剑的杀伤力可谓锐不可当,对它的名字没有很刻意的去琢磨,碰巧看到这个单词觉得比较喜欢,当然我希望它日后能够成为一把锐利的杀手锏。我个人的追求简洁和优雅的,所以在设计上不追求过度抽象。 blade 借鉴了很多优秀mvc框架的设计,它是为java开发人员提供的便捷易用快速上手的一款框架,你可以用它快速开发API、Web 及后端服务等各种应用,漂亮大方的博客系统

  • 本文向大家介绍Laravel 5框架学习之Blade 简介,包括了Laravel 5框架学习之Blade 简介的使用技巧和注意事项,需要的朋友参考一下 在多个页面中我们可能包含相同的内容,像是文件头,链接的css或者js等。我们可以利用布局文件完成这个功能。 让我们新建一个布局文件,例如 views/layout.blade.php 我们创建了不解的结构,引入了bootstrap,注意 @yiel

  • 我正在尝试对从刀片模板中的控制器中的查询返回的数据数组运行foreach循环。无论我如何尝试,我总是会收到一个错误,说“Undefined offset:1”。如果我只是简单地打印出,它会显示我所期望的,但由于某种原因,它没有foreach循环。 下面是我从日志中的查询中得到的一个打印输出(实际数组显然有更多的值): 我一直在尝试不同的方法,因为这是我最终要实现的目标: 我希望这是一件简单的事情,

  • 您好,有人能告诉我这个laravel的foreach循环有什么问题吗?:如果我在不使用会话的情况下更改foreach循环,请继续获取以下错误或未定义的POST变量: 控制器: 或者,如果我使用其他版本,我会在视图仪表板中获得未定义的$POST: 控制器: 仪表板视图: 路线:

  • 从Laravel的foreach循环获取错误消息: 我的foreach循环是: 我的控制器是: