recherche

Maison  >  Questions et réponses  >  le corps du texte

J'ai du mal à utiliser les relations polymorphes dans Laravel 9.x

J'ai 5 tables nommées "Utilisateurs", "Chats", "Buletins", "Hartas" et "Propriétaires". Toutes ces tables ont une relation plusieurs-à-plusieurs avec une autre table appelée Medias via un tableau croisé dynamique appelé Mediables.

Je dois utiliser une relation polymorphe car les 5 tables utiliseront la même table Mediables pour stocker leur relation avec la table Medias.

Pour ce sujet, permettez-moi de partager les relations polymorphes Annonce, Média et Média définies dans leurs fichiers modèles respectifs. Je partagerai également les fichiers de migration du contrôleur tablemy Médiables

Annonce du modèle :

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;

class Buletin extends Model
{
  public function user() 
  {
    return $this->belongsTo(User::class);
  }
  public function medias(): MorphToMany
  {
    return $this->morphToMany(Media::class, 'mediable');
  }
}

Modèle média :

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;

class Media extends Model
{
  public function buletins(): MorphToMany
  {
    return $this->morphedByMany(Buletin::class, 'mediable');
  }
}

Modèle médical :

class Medialink extends Model
{
  // no relation defined
}

Migration traitable :

public function up()
{
  Schema::create('mediables', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('media_id');
    $table->foreign('media_id')->references('id')->on('medias')->onDelete('cascade');
    $table->unsignedBigInteger('mediable_id');
    $table->string('mediable_type');
    $table->timestamps();
  });
}

Dans le fichier du contrôleur :

public function showbuletin ($id)
{
  $buletins = Buletin::where('id', $id)->orWhere('comment_id', $id)->paginate(5);
  return view('layouts.buletin.show-bbs')->with(compact('buletins'));
}

Dans show-bbs.blade.php, j'ai réussi à faire écho à tout cela ($buletins pour $buletin) dans une boucle foreach :

{{ $buletin->user->name }} // Buletin belongsTo User & User hasMany Buletin
{{ $buletin->messages }}
{{ $buletin->created_at }}

Le problème est que je n'ai pas répondu à ceci :

{{ $buletin->medias }} // gives me "[]" on the display

S'il vous plaît, aidez-moi.

P粉366946380P粉366946380458 Il y a quelques jours503

répondre à tous(1)je répondrai

  • P粉026665919

    P粉0266659192023-09-11 10:48:00

    Cette question a déjà une réponse. Le problème est de savoir comment enregistrer le mediaable_type dans la table mediaables. Voici comment je l'ai enregistré pour fonctionner :

    Fichier du contrôleur :

    // store new buletin_media in mediables table
    if ($request->media_id) {
      foreach ($request->media_id as $key => $value) {
        Mediable::create([
          'media_id' => $value,
          'mediable_id' => $buletin->id,
          'mediable_type' => Buletin::class,
        ]);
      }
    }

    J'ai dû sauvegarder le modèle d'annonce exact pour que cela fonctionne correctement.

    répondre
    0
  • Annulerrépondre