Красноречивый идентификатор и внешний ключ - PullRequest
0 голосов
/ 20 октября 2019

В моей таблице Cous есть столбец date_seance с 2 записями.

enter image description here

В моей таблице Retour, я должен получитьdate_seance.

enter image description here

Кроме этого, я всегда получаю одно и то же значение. Где 23/10/2019 один?

В моей модели Cous У меня есть это:

public function retours()
    {
        return $this->hasManyThrough(
            'App\Retour',
            'App\Eleve',
            'fk_cours', 
            'fk_eleve',
            'id', 
            'id' 
        );
    }

В моей Retour index.blade.php У меня есть это:

 @foreach($retours as $retour)
 <tr>
    <td> {{$retour->instruction}}</td>
    <td> {{$retour->description}}</td>
    <td> {{$retour->eleves->nom}}</td>  
    <td> {{$retour->eleves->prenom}}</td>  
    <td> {{$retour->eleves()->first()->cours()->first()->date_seance->format('d/m/Y')}}</td>
    <td> {{$retour->eleves()->first()->cours()->first()->moniteurs->nom}}</td>
    <td> {{$retour->eleves()->first()->cours()->first()->moniteurs->prenom}}</td>
    <td> {{$retour->eleves()->first()->paiements()->first()->date_saisie->format('d/m/Y')}}</td> 

Моя проблема в этой строке:

<td> {{ $retour->eleves()->first()->cours()->first()->date_seance->format('d/m/Y') }}</td>

Я не понимаю мою проблему.

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 21 октября 2019

Несколько вещей, чтобы упомянуть. Во-первых, вызов ваших отношений eleves в форме блэйда выглядит следующим образом:

$retour->eleves()

будет возвращаться к базе данных при каждом отдельном вызове. Это может привести к большой задержке, если у вас много retour объектов или даже если вы просто просматриваете эту таблицу.

Настоятельно рекомендуем загружать как можно больше, по крайней мере на retour коллекция.

На вашем контроллере :

// Not sure if you had any constraints, but this will eager load eleves
$retours = Retour::with('eleves')->get();  

Проблема с тем, что вы всегда тянете одну и ту же дату, заключается в том, что вы возможно тянете с одного и того же объекта,Я люблю хорошую цепь ... но иногда более длинные цепи становятся более запутанными, чем они того стоят. Взгляните на эту строку:

$retour->eleves()->first()->cours()->first()->date_seance

Если вы прервете это только из первого цикла на своей странице блейда, вы вытяните первый eleves из этого первого retour объекта из всей коллекции. из retour объектов. Затем вы вытягиваете первый cours объект из этого первого eleves из этого первого retour объекта. Причина, по которой дата совпадает, заключается в том, что вы , возможно, тянете тот же cours объект. Возможно, я говорю, потому что метод first() просто извлекает первый экземпляр, связанный с объектом retour в базе данных. Не последний , просто первый. Таким образом, если есть несколько eleves для каждого retour, если тот, у которого, скажем, id из 1, присоединен как к первому, так и ко второму retour, вы вытягиваете тот же самый точный eleves во второмпетля. Это дополнительно усугубляется точно такой же проблемой отношения cours с eleves. Если вы скажете cours с id из 21, присоединенным к нескольким eleves, вы могли бы тянуть точно такой же cours, даже если вы находитесь на совершенно разных циклах для обоих retour и eleves.

Чтобы это исправить, вам нужно иметь твердую ручку на , которая eleves и , на которую cours объекты вы ссылаетесьв вашей петле. Я бы порекомендовал не делать запросы на верхнем уровне (retours), а скорее иметь пару запросов более низкого уровня по этим отношениям (eleves или cours) и выполнять цикл непосредственно для тех, кто находится в вашем блейде.

Например, в вашем контроллере :

$courses = Cours::where('some constraint', $someConstrainer)->get()

Затем в вашем блейде , просто цикл в коллекции $courses:

@foreach($courses as $cours){
    // Other stuff here...
    <td> {{ $cours->first()->date_seance->format('d/m/Y') }}</td>

Если вы не можете сделать это на уровне cours, возможно, вернитесь на один уровень выше и загрузите с помощью eleves (одновременно стремясь загрузить объекты cours).

...