2017-07-21 1 views
2

Je suis en train de créer un blog et j'ai deux modèles, Post et Tag. Je veux connecter les deux avec un tableau croisé dynamique. C'est une relation de plusieurs à plusieurs et je n'arrive pas à comprendre comment relier les posts et les tags. quand j'essaye de le faire, il ne renvoie rien sur ma base de données. Les messages ont un titre et le contenu tandis que les tags ont seulement le nom. J'ai lu que je dois utiliser la méthode de synchronisation ou attach-detach mais je ne sais pas où faire cela. Est-ce sur les routes des messages ou des itinéraires de tags? J'ai inclus les routes des postes et des balises sur routes.php les grouper en utilisant:2 modèles avec table pivotante, plusieurs à plusieurs relation

Route::resource('/tags', 'TagController'); 

Route::resource('/posts', 'PostController'); 

Voici ce que j'ai jusqu'à présent:

Mon modèle Post:

class Post extends Model{ 
protected $fillable = [ 
    'title', 'content' 
]; 

protected $hidden = [ 
    'view_count' 
]; 

public function tags() 
{ 
    return $this->belongsToMany('App\Tag', 'post_tag'); 
}} 

Voici mon modèle Tag:

class Tag extends Model{ 
protected $fillable = [ 
    'name' 
]; 

public function posts(){ 
    return $this->belongsToMany('App\Post', 'post_tag'); 
}} 

Voici mon tableau croisé dynamique de post_tag:

class CreatePostTagTable extends Migration{ 

public function up() 
{ 
    Schema::create('post_tag', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('post_id')->unsigned()->nullable()->index(); 
     $table->foreign('post_id')->references('id')->on('posts'); 
     $table->integer('tag_id')->unsigned()->nullable()->index(); 
     $table->foreign('tag_id')->references('id')->on('tags'); 
     $table->timestamps(); 
    }); 
} 

public function down() 
{ 
    Schema::dropIfExists('post_tag'); 
}} 
+0

Le code semble bon. Qu'est-ce que vous essayez qui ne fonctionne pas? –

+0

Eh bien, quand je veux créer un post, je veux que le seul utilisateur, qui est l'administrateur, associe les tags qu'il veut à son poste. Quelle route devrais-je créer avec la méthode sync pour connecter les messages avec les tags, car mes messages et mes tags sont stockés à la création, mais rien n'est stocké dans la table post_tag – livia

+0

@joel hinz Je me rends compte maintenant que mon crud semble bon, mais j'ai une question sans rapport avec vous. Puis-je modifier la question du trou pour demander comment implémenter la case à cocher tag dans la vue create de la publication? – livia

Répondre

1

Hé là j'étais nouveau aussi dans laravel, et j'ai le même problème avec toi. Dans votre cas, je pense que la meilleure pratique est de l'attacher dans votre PostController.php. Permettez-moi de partager le code pour vous, et je l'espère peut aider

PostController

public function store (Request $request) { 

    // First we need to create variable that contain your tag_id 
    // $tags = [1, 2, 4]; something like this 
    $tags = $request->input('tags'); 



    // Now storing the data in posts table 
    $post = new Post; 
    $post->title = $request->input('title'); 
    $post->content = $request->input('content'); 
    $post->save(); 

    //After save the post, we need to attach it 
    $post->tags()->attach($tags); 
} 

Edit: Ajouter exemple vue

<div> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="1"> 
 
    <label for="subscribeNews">Tag 1</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="2"> 
 
    <label for="subscribeNews">Tag 2</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="3"> 
 
    <label for="subscribeNews">Tag 3</label> 
 
    <input type="checkbox" id="subscribeNews" name="tags[]" value="n"> 
 
    <label for="subscribeNews">More tag</label> 
 
    </div>

Et puis en PostC ontroller.php vous pouvez obtenir l'ID si l'utilisateur cochez la case:

$tags = $request->input('tags'); 

Edit2: Ajouter par exemple utiliser la synchronisation

Ici, je vous donne peu exemple sur l'utilisation de synchronisation, d'abord nous allons définir un poste qui ont 5 étiquettes dessus. Et à la fin, nous voulons juste le mettre 3

$post = Post::find(1) //get the post with id 1, this post have 5 tags 
// Let's say that this post have 5 tags with this ids [1, 2, 3, 4, 5] 

// And then admin edit this post and select the tag with id [1, 2, 6] we set it in $tags variable 
$tags = $request->input('tags'); //[1, 2, 6] 

// And the last we just need to use sync method like this 
$post->tags()->sync($tags); 

// After use that, it will detach the tag based from removed ids [3, 4, 5] and attach new tag if there's new tag id [6] 
// And in the end the post just have 3 tags 

Bon qui est par exemple logique, j'apprends encore à ce sujet aussi, mais je l'espère, il peut vous aider: D

+0

pouvez-vous s'il vous plaît me montrer un exemple en utilisant la synchronisation() ? voici la chose. Lorsque l'administrateur crée un nouveau post ou le modifie, il peut affecter un ou plusieurs tags au post, quel que soit le tag qu'il souhaite. Aussi, il a le droit de créer de nouveaux tags. N'est-il pas préférable que les tags créés soient synchronisés automatiquement? De cette façon, il peut supprimer, créer de nouveaux tags et sélectionner un ou plusieurs tags dans la liste. p.s. Je n'ai toujours pas créé la liste déroulante des tags dans mon message créer vue – livia

+0

Ah regarde mon edit cher: D –

+0

merci @Arigi :) – livia

1

Utilisez la fonction sync(), ex:

$post->tags()->sync($array_of_tags_ids) 
+0

Est-il nécessaire d'inclure seulement Numéros comme ID? Je ne sais pas quels tags l'administrateur va choisir pour son poste. Y at-il une autre façon au lieu de créer le tableau avec l'ID de balise? – livia

+0

@livia Qu'avez-vous en tête? Parce que pour définir une relation, il suffit d'utiliser le tableau croisé dynamique qui transmet l'identifiant des deux balises et de poster –

+0

Lorsque l'administrateur crée un nouveau post ou l'édite, il peut assigner un ou plusieurs tags à la publication, quelle que soit la balise qu'il souhaite. Aussi, il a le droit de créer de nouveaux tags. Logiquement, si je passe tag_id 1 ou 3 ou autre, ne suis-je pas obligé de choisir seulement entre 1 ou 3? – livia