Laravel 5.4 OrderBy通过关系

时间:2017-06-05 12:49:58

标签: php laravel-5 foreach relationship

我正试图通过关系hasMany来命名。如果我在第二次预告中订购,不起作用,我明白我必须在第一次预告中这样做但我怎么能这样做? 也许我可以在控制器中做到这一点,但我不知道如何。这是我的代码:

在视图中:

@foreach($data['tags'] as $tag)
        <tr>

            <td>{!! date('d-m-Y', strtotime($tag->created_at)) !!}</td>

            <td>
                @foreach($tag->langs()->orderBy('name', 'asc')->get() as $tag_lang)
                    @include('panel.partials.list_name', ['value' => $tag_lang, 'route' => 'tags.edit', 'id' => $tag->id, 'name' => $tag_lang->name])
                @endforeach
            </td>
        </tr>
    @endforeach

Tag中的关系:

public function langs()
{
    return $this->hasMany('App\Models\LangTag');
}

LangTag中的关系:

public function tag()
{
    return $this->belongsTo('App\Models\Tag');
}

控制器:

public function index()
    {
        $data['tags'] = Tag::paginate(25);
        return view('panel.tags.index', compact('data'));
    }

2 个答案:

答案 0 :(得分:0)

public function langs()
{
    return $this->hasMany('App\Models\LangTag')->orderBy('name');
}

或者像这样:

public function index()
{
    $data['tags'] = Tag::all()->langs()->orderBy('name')->paginate(25);
    return view('panel.tags.index', compact('data'));
}

答案 1 :(得分:0)

在获取标签时,您可以通过订购急切地加载它。清洁解决方案。

public function index()
{
    $tags = Tag::with('langs')->paginate(25);

    return view('panel.tags.index', compact('tags'));
}

@foreach($tags as $tag)
<tr>
    <td>{{ $tag->created_at->format('d-m-Y') }}</td>
    <td>
        @foreach($tag->langs->sortBy('name') as $lang)
            @include('panel.partials.list_name', [
                'value' => $lang,
                'route' => 'tags.edit',
                'id' => $tag->id,
                'name' => $lang->name
            ])
        @endforeach
    </td>
</tr>
@endforeach