Support the ongoing development of Laravel.io →
posted 5 months ago
Laravel Blade

I am working on a blogging application in Laravel 8.

There is the option to add tags to articles. There is a many-to-many relationship between articles and tags. I have an article_tag pivot table.

In the Tag model I have:

class Tag extends Model
{
   use HasFactory;

   protected $fillable = ['name'];

   public function articles()
   {
       return $this->belongsToMany(Article::class);
   } 
}

To the Article model I have added the tags() method

public function tags()
{
    return $this->belongsToMany(Tag::class)->as('tags');
}

I the ArticleController controller I have the two methods for editing and updating an article:

public function edit($id)
  {
	$article = Article::find($id);
	$attached_tags = $article->tags()->get()->pluck('id')->toArray();
	
	return view(
	  'dashboard/edit-article',
	  [
		'categories' => $this->categories(),
		'tags' => $this->tags(),
		'attached_tags' => $attached_tags,
		'article' => $article
	  ]
	);
}

public function update(Request $request, $id)
{
	$validator = Validator::make($request->all(), $this->rules, $this->messages);

	if ($validator->fails()) {
	  return redirect()->back()->withErrors($validator->errors())->withInput();
	}

	$fields = $validator->validated();
	$article = Article::find($id);

	// If a new image is uploaded, set it as the article image
	// Otherwise, set the old image...
	if (isset($request->image)) {
	  $imageName = md5(time()) . Auth::user()->id . '.' . $request->image->extension();
	  $request->image->move(public_path('images/articles'), $imageName);
	} else {
	  $imageName = $article->image;
	}

	$article->title = $request->get('title');
	$article->short_description = $request->get('short_description');
	$article->category_id = $request->get('category_id');
	$article->tags[] = $request->get('tags[]');
	$article->featured = $request->has('featured');
	$article->image = $request->get('image') == 'default.jpg' ? 'default.jpg' : $imageName;
	$article->content = $request->get('content');
	// Save changes to the article
	$article->save();

	//Attach tags to article
	if (isset($request->tags)) {
	  $article->tags()->sync($request->tags);
	} else {
	  $article->tags()->sync([]);
	}

	return redirect()->route('dashboard.articles')->with('success', 'The article titled "' . $article->title . '" was updated');
}

In edit-article.blade.php, I use a multiselect element to assign tags to articles:

<div class="row mb-2">
	<label for="tags" class="col-md-12">{{ __('Tags') }}</label>

	<select name="tags[]" id="tags" class="form-control" multiple="multiple">
		@foreach ($tags as $tag)
			<option value="{{ $tag->id }}"
				{{ in_array($tag->id, $attached_tags) ? 'selected' : '' }}>{{ $tag->name }}</option>
		@endforeach
	</select>
</div>

The problem I am faced with is that, when I edit the tags list, the <select> element above does not keep the selected tags if the form is invalid because of validation errors on other form fields.

Where is my mistake?

0

Sign in to participate in this thread!

Eventy

Your banner here too?

Razvan ajax30 Joined 2 Oct 2021

Moderators

We'd like to thank these amazing companies for supporting us

Your logo here?

Laravel.io

The Laravel portal for problem solving, knowledge sharing and community building.

© 2025 Laravel.io - All rights reserved.