Как посчитать строки в другой таблице, которая содержит внешний ключ и l oop это foreach экземпляр коллекции? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть две таблицы, которые связаны друг с другом. их структуры выглядят так:

modul_table

id | user_id | название | слизняк | платформа

таблица лекций

id | user_id | modul_id | название | content

Я хочу посчитать, сколько строк в lecture_table, где его modul_id = $id. Так что $id - это идентификаторы моей коллекции, полученные из контроллера.

вот мой контроллер:

public function index()
    {
        $modul = Modul::get();
        $arr_lecture = [];
        foreach ($modul as $key) {
            $lecture = Lecture::where('modul_id', $key->id)->count();
            array_push($arr_lecture, $lecture);
        }
        return view('func.lihatModul', compact('modul', 'arr_lecture'));
    }

и, на мой взгляд:

@php $i = 0 @endphp
@foreach($modul as $key) 
<tr>
    <td>{{$key->id}}</td>
    <td>{{$key->title}}</td>
    <td>{{substr($key->desc, 0, 75)}}</td>
    <td>{{ $arr_lecture[$i++] }}</td>
@endforeach

и результат:

enter image description here

enter image description here

все мои коды работают хорошо, но есть ли просто с помощью построителя запросов или функции, чтобы сделать тот же подход?

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Если вы определили отношение lectures в вашей Modul модели следующим образом:

# Modul.php

public function lectures()
{
    return $this->hasMany(Lecture::class);
}

Тогда вы можете просто сделать это в вашем ModulController:

public function index()
{
    $moduls = Modul::withCount('lectures')->get();
    //              ^^^^^^^^^^^^^^^^^^^^

    return view('func.lihatModul')->withModuls($moduls);
}                                 ^^^^^^^^^^^^^^^^^^^^^

Это добавит атрибут lectures_count к каждому $modul, так что вы можете получить к нему доступ в своем режиме просмотра Blade следующим образом:

@foreach($moduls as $modul) 
<tr>
    <td>{{ $modul->id }}</td>
    <td>{{ $modul->title }}</td>
    <td>{{ substr($modul->desc, 0, 75) }}</td>

    <td>{{ $modul->lectures_count }}</td> // <-----
@endforeach

Проверьте документы по этому разделу: Подсчет связанных моделей .

0 голосов
/ 25 марта 2020

Если вы хотите оставить свой вариант, вам не нужно использовать array_push лучше хранить значение в массиве с $key

public function index()
    {
        $modul = Modul::get();
        $arr_lecture = [];
        foreach ($modul as $key) {
            $lecture = Lecture::where('modul_id', $key->id)->count();
            $arr_lecture[$key->id] = $lecture;
        }
        return view('func.lihatModul', compact('modul', 'arr_lecture'));
    }

, теперь $arr_lecture будет иметь правильные ключи. Следующий на виду

@foreach($modul as $key) 
<tr>
    <td>{{$key->id}}</td>
    <td>{{$key->title}}</td>
    <td>{{substr($key->desc, 0, 75)}}</td>
    <td>{{ count($arr_lecture[key->id]) }}</td>
@endforeach

но версия Kennys действительно хороша

0 голосов
/ 25 марта 2020

Если у вас правильно установлены отношения «один ко многим», как это объясняется в документации https://laravel.com/docs/master/eloquent-relationships#one-ко-многим

То же самое в вашей модели. php

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

и в вашей лекции. php модель

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

тогда вы просто сможете сделать

$modul = Modul::with('lectures')->get();

Тогда в клинке

@foreach($modul as $key) 
<tr>
    <td>{{$key->id}}</td>
    <td>{{$key->title}}</td>
    <td>{{substr($key->desc, 0, 75)}}</td>
    <td>{{ $key->lectures->count() }}</td>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...