Estou trabalhando em um aplicativo de blog no Laravel 8.
No formulário que uso para editar artigos, tenho um elemento de seleção múltipla.
Quero que o formulário mostre as tags que foram selecionadas. Para isso, fiz o seguinte na view:
<label for="tags" class="col-md-12">{{ __('Tags') }}</label>
@php
$selected = explode(",", $tags);
@endphp
<select name="tags[]" id="tags" class="form-control" multiple="multiple">
@foreach ($tags as $tag)
<option value="{{ $tag->id }}" {{ (in_array($tag->id, $selected)) ? 'selected' : '' }}>{{ $tag->name }}</option>
@endforeach
</select>
No controlador, tenho:
public function edit($id)
{
$article = Article::find($id);
return view(
'dashboard/edit-article',
[
'categories' => $this->categories(),
'tags' => $this->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->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 ($request->has('tags')) {
$article->tags()->attach($request->tags);
}
return redirect()->route('dashboard.articles')->with('success', 'The article titled "' . $article->title . '" was updated');
}
Por um motivo que não consegui identificar, isso não funciona. Isso significa que as tags do artigo não estão selecionadas no <select>
elemento.
Onde está meu erro?
De acordo com seu código, posso deduzir que a variável tags é uma coleção de objetos. Como tal, você não pode explodi-la assim em seu arquivo blade dentro da declaração de bloco php. A função explode php aceita um "separador" e "string" como argumentos de acordo com sua documentação aqui . Se seu objetivo é retornar os ids das tags selecionadas, você pode extrair a coluna id na coleção tags e retorná-la como um array, conforme mostrado abaixo. Isso é claro se "tags" for de fato uma coleção, caso contrário, você pode torná-la uma.
Mas se não for uma coleção,
Depois disso, você pode passá-lo para a visualização com o restante dos dados no método edit no seu controlador. Portanto, você não precisará mais do bloco php no seu arquivo blade e as tags selecionadas agora devem estar visíveis.