2017-06-02 3 views
1

J'essaie de comprendre comment fonctionne l'Eloquent et quels sont les avantages par rapport à l'utilisation de requêtes sql simples (joindre les tables A et B sur columA.id = columnB.id ...)Laravel> Utiliser Eloquent Interroger des relations plusieurs-à-plusieurs

J'ai deux modèles: canaux et sous-catégories dans plusieurs à-plusieurs

J'ai créé un tableau croisé dynamique channel_subcategory et addded la relation comme ceci:

public function up() 
{ 
    Schema::create('channel_subcategory', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamp('created_at')->useCurrent(); 
     $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); 
     $table->integer('channel_id')->unsigned()->nullable(); 
     $table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade'); 
     $table->integer('subcategory_id')->unsigned()->nullable(); 
     $table->foreign('subcategory_id')->references('id')->on('subcategories') ->onDelete('cascade'); 
    }); 
} 


I want to get one channel given the slug property and the subcategories it belongs to. So I did this in the ChannelController.php 

public function show($slug) 
{ 
    $channel = Channel::where('channels.slug', '=', $slug)->first(); 
    foreach ($channel as $subcategory) { 
     echo $subcategory->title; 
    } 
} 

I get the error: 

ErrorException in ChannelController.php line 107: Trying to get property of non-object 


All I want is to show the channel name and the categories it belongs to. 

J'ai lu beaucoup de blogs, y compris la documentation Laravel et ils expliquent toujours les migrations, comment pour établir la relation dans le modèle (appartenomany), et même comment enregistrer des données connexes. Mais nulle part j'ai trouvé une seule description (pour les nuls) qui dit, bien maintenant, nous allons obtenir quelques données sur les deux tables comme:

  • obtenir toutes les catégories appartient à un canal.
    • obtenir tous les canaux dans une catégorie
    • obtenir tous les canaux qui appartiennent à plus d'une catégorie
    • obtenir la catégorie avec plus de chaînes.

En d'autres termes, une explication simple sur la façon de le faire.

EDIT Ajout mon modèle de canal

public function subcategory() 
{ 
    return $this->belongsToMany('App\Subcategory')->withTimestamps(); 
} 

Répondre

1

Vous devez définir la relation entre vos modèles. Dans votre cas, vous devez créer une relation subcategories dans le modèle Channel.

public function subcategories() 
{ 
    return $this->belongsToMany(Subcategory::class, 'channel_subcategory', 'channel_id', 'subcategory_id')->withTimestamps(); 
} 

Remplacez SubCategory par ce que vous avez nommé le modèle.

Ensuite, dans votre contrôleur, vous pouvez accéder à la relation comme celui-ci

$channel = Channel::where('slug', $slug)->first(); 

foreach ($channel->subcategories as $subcategory) { 
    echo $subcategory->title; 
} 

Bien que le code ci-dessus fonctionne, vous devez toujours prêt charge si vous allez avoir besoin de données relationnelles. Cela empêche le problème de requête N + 1.

$channel = Channel::with('subcategories')->where('slug', $slug)->first(); 
+0

J'ai effectué ma question avec mon modèle de canal. Est-ce incorrect? Si je "var_dump" ce que je reçois je vois le nom de la chaîne et aussi le nom des catégories ot appartient à. Mon problème, je pense, est de faire écho au nom de la sous-catégorie. Par conséquent, il dit: Essayer d'obtenir la propriété de non-objet –

+0

La boucle dans votre question boucle à travers le '$ channel' qui n'est pas les sous-catégories. Vérifiez la boucle que j'ai montrée. J'ai également corrigé la relation dans mon code. J'avais fait une erreur en changeant les champs de relation de l'exemple. – Sandeesh

+0

Merci l'homme !!! Cela fonctionne après plusieurs jours d'essai! En passant: Connaissez-vous un tutoriel où je pourrais obtenir ce expliqué et créer de telles requêtes que j'ai posté? (tous les canaux dans les catégories, les catégories avec plus de canaux, les canaux sans catégories, etc.)? J'accepte votre réponse. Merci encore –