'Laravel 5.2 - use attach method with array values

I am creating a blog with posts in Laravel 5.2. Every post is going to have multiple tags. I created a relationship between posts and tags. When the post is created, I am trying to attach multiple tags to it.

Controller function

public function store(Request $request)
{
        $attributes = [
            'author_id' => Auth::user()->id,
            'title' => $request->input('title'),
            'text' => $request->input('text'),
        ];

        $post = Post::create($attributes);

        // Get the tag ids from the the tags table in the database
        $tagsList = $request->input('tags');        
        $tags = explode(",", $tagsList);

        $tagIds = array();
        foreach($tags as $tag) {
          $tagIds[] = Tag::select('id')->where('name', $tag)->limit('5')->get();
        }

        dd($tagIds); // Output below

        $post->tags()->attach($tagIds); // not working
}

dd($tagIds) output

array:2 [▼
  0 => Collection {#316 ▼
    #items: array:1 [▼
      0 => Tag {#317 ▼
        #fillable: array:2 [▶]
        #connection: null
        #table: null
        #primaryKey: "id"
        #keyType: "int"
        #perPage: 15
        +incrementing: true
        +timestamps: true
        #attributes: array:1 [▼
          "id" => 32
        ]
        #original: array:1 [▶]
        #relations: []
        #hidden: []
        #visible: []
        #appends: []
        #guarded: array:1 [▶]
        #dates: []
        #dateFormat: null
        #casts: []
        #touches: []
        #observables: []
        #with: []
        #morphClass: null
        +exists: true
        +wasRecentlyCreated: false
      }
    ]
  }
  1 => Collection {#318 ▼
    #items: array:1 [▼
      0 => Tag {#319 ▼
        #fillable: array:2 [▶]
        #connection: null
        #table: null
        #primaryKey: "id"
        #keyType: "int"
        #perPage: 15
        +incrementing: true
        +timestamps: true
        #attributes: array:1 [▼
          "id" => 36
        ]
        #original: array:1 [▶]
        #relations: []
        #hidden: []
        #visible: []
        #appends: []
        #guarded: array:1 [▶]
        #dates: []
        #dateFormat: null
        #casts: []
        #touches: []
        #observables: []
        #with: []
        #morphClass: null
        +exists: true
        +wasRecentlyCreated: false
      }
    ]
  }
]

The returned array contains correct ids of the tags. I just do not know how to get them into a format, so that they can be passed to the attach method.

I would be very thankful for any kind of help!



Solution 1:[1]

For convenience, attach and detach also accept arrays of IDs as input:

        $tagIds = array();
        foreach($tags as $tag) {
          $tagIds[] = Tag::select('id')->where('name', $tag)->first()->id;
        }

        dd($tagIds); // Output below
        /* 
       Array
       (
           [0] => 1
           [1] => 3
           [2] => 5
        )
        */

        $post->tags()->attach($tagIds); 

Solution 2:[2]

You can just use pluck to get the array of ids from collection, no need to loop to get the ids of tags.

example: $tags = Tag::pluck('id');

$post->tags()->attach($tags);

Please also refer to the documentation https://laravel.com/docs/9.x/collections#method-pluck

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ascsoftw
Solution 2 aksji