отображать данные из нескольких таблиц и внешних ключей в laravel - PullRequest
0 голосов
/ 05 июня 2019

У меня есть две таблицы:

bonhomme

+----+--------------+
| id |     name     |
+----+--------------+
|  1 | Alec Badwin  |
|  2 | Maria Quiban |
+----+--------------+

серия

+----+---------------+
| id |     name      |
+----+---------------+
|  1 | 30 Rock       |
|  2 | Good Day L.A. |
+----+---------------+

У меня есть еще однаПозвонил: serie_personnage

+----+-------------+----------+--------------+
| id | bonhomme_id | serie_id |  personnage  |
+----+-------------+----------+--------------+
|  1 |           1 |        1 | Jack Donaghy |
|  2 |           2 |        2 | Maria Quiban |
+----+-------------+----------+--------------+

Я хочу отобразить персонажа из serie_personnage и связать его в моем клинке с именем bonhomme (в моей таблице bonhomme).

Другими словами, я хочу, чтобы в моем блейде была таблица со строками, в которой есть столбец 1, имя bonhomme, а в столбце 2 - личный состав.

Как я могу это сделать с помощью отношенийв Ларавеле?Я пробовал, но он не работает хорошо.

Контроллер

public function show($id)
{
    $serie = Serie::where('id', $id)->first();
    return view('admin.series.castings.show')->withSerie($serie);
}

Модель - Серия

public function personnages() 
{
    return $this->hasMany('App\Models\Admin\SeriePersonnage');
}

public function acteurs()
{
    return $this->belongsToMany('App\Models\Admin\Bonhomme', 'serie_personnage', 'serie_id', 'bonhomme_id');
}

Blade

<tbody>
    @foreach($serie->acteurs as $acteur)  
    @foreach($serie->personnages as $personnage) 
    <tr>
        <td>{{ $acteur->nom }}</td>
        <td>{{ $personnage->personnage }}</td>
        <td><a href="#">bla</a></td>
        <td>{{ $personnage->rang }}</td>
        <td class="has-text-right">
            <a class="button is-outlined" href="{{ route('series.show', $serie->id) }}">
                Voir
            </a>
            <a class="button is-outlined" href="#">Editer</a>
        </td>
    </tr> 

    @endforeach
    @endforeach
 </tbody>

Мой стол на виду

1 Ответ

1 голос
/ 05 июня 2019

Я должен помочь вам как французский разработчик! Прежде всего, я бы поменял ваш контроллер на более простой способ получить серию:

public function show($id)
{
    $serie = Serie::findOrFail($id);
    return view('admin.series.castings.show')->withSerie($serie);
}

РЕДАКТИРОВАТЬ: я использую Model::findOrFail($id);, потому что он выбрасывает Illuminate\Database\Eloquent\ModelNotFoundException. Если вы не поймете исключение, Laravel автоматически отправит HTTP-ответ 404. Это предотвращает ошибку пользователя при использовании устаревшей ссылки. Для получения дополнительной информации см. Документ .

Тогда я не думаю, что будет хорошей идеей использовать цикл foreach дважды ... Я бы предпочел использовать только один цикл foreach для персонажей. Затем я получу актера персонажа из модели Personnage. Он должен выглядеть так, как показано ниже:

App \ Models \ Admin \ SeriePersonnage.php

<?php

namespace App\Models\Admin;

use App\Models\Admin\Bonhomme;

use Illuminate\Database\Eloquent\Model;

class SeriePersonnage extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        //Whatever you want to put here
    ];

    /**
     * Gets the actor of the character     
     */
    public function actor() {
        return $this->belongsTo(Bonhomme::class);
    }
}

Тогда в вашем виде лезвия:

<tbody>

@foreach($serie->personnages as $personnage) 
<tr> 
  <td>{{$personnage->actor->nom}}</td>
  <td>{{$personnage->personnage}}</td>
  <td><a href="#">bla</a></td>
  <td>{{$personnage->rang}}</td>
  <td class="has-text-right"><a class="button is-outlined" href="{{route('series.show', $serie->id)}}">Voir</a>  <a class="button is-outlined" href="#">Editer</a></td>
</tr> 

@endforeach
</tbody>

Вы также можете добавить personnages() методы в вашу модель актера, чтобы вы могли получить всех персонажей, которых играет этот актер.

Также я бы посоветовал вам использовать английские слова для имен переменных, имен классов и фактически для каждого слова в вашем коде, особенно если вы публикуете справку на английских веб-сайтах. Я бы также порекомендовал вам изменить SeriePersonnage только на Personnage, если вы управляете только сериалами (вы также можете обрабатывать фильмы, японское аниме и т. Д., В этом случае вы можете игнорировать мое сообщение). Также было бы здорово изменить имя строки serie_personnage с personnage на nom.

Надеюсь, это помогло вам, и я не делал ошибок: P

...