Какой аналог attach() есть для связи belongsTo, Laravel?
Какой аналог attach() есть для связи belongsTo, Laravel?
Есть таблица users и books
И мне при добавлении (а так же при редактировании) новой книги, нужно выбрать (поменять, при редактировании) её автора из списка уже имеющихся
Список в виде <input type="radio"> вывел
Но при вводе названия, выборе жанров и автора, всё указывается кроме автора
Добавление
<div class="container">
<a href="{{ url('books') }}" class="btn btn-primary">Вернуться</a>
<hr>
<h2>Добавить новую книгу</h2>
<form method="POST" action="{{route('books.store')}}">
@csrf
<div class="input-group mb-3">
<input name="book" type="text" class="form-control" placeholder="Название книги">
@error('book')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<div class="form-group">
<h3>Авторы:</h3>
@foreach($users as $user)
<input type="radio" name="name" value="{{$user->id}}">
<label>{{$user->name}}</label>
<br>
@endforeach
@error('name')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<div class="form-group">
<h3>Жанры:</h3>
@foreach($genres as $genre)
<input type="checkbox" name="genres[]" value="{{$genre->id}}">
<label>{{$genre->genre}}</label>
<br>
@endforeach
@error('genres[]')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<button type="submit" class="btn btn-success">Создать</button>
</form>
</div>
Редактирование
<div class="container">
<a href="{{ url('books') }}" class="btn btn-primary">Вернуться</a>
<hr>
<h2>Редактировать книгу: {{$book->book}}</h2>
<form method="POST" action="{{route('books.update', $book->id)}}">
@csrf
@method('PUT')
<div class="input-group mb-3">
<input name="book" type="text" class="form-control" placeholder="Название книги" value="{{$book->book}}">
@error('book')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<div class="form-group">
<h3>Авторы:</h3>
@foreach($users as $user)
<input type="radio" name="name" value="{{$user->id}}">
<label>{{$user->name}}</label>
<br>
@endforeach
@error('name')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<div class="form-group">
<h3>Жанры:</h3>
@foreach($genres as $genre)
<input type="checkbox" name="genres[]" value="{{$genre->id}}"
@if($book->genres->where('id', $genre->id)->count())
checked="checked"
@endif
>
<label>{{$genre->genre}}</label>
<br>
@endforeach
@error('genres[]')
<p class="text-red-500">{{$message}}</p>
@enderror
</div>
<button type="submit" class="btn btn-success">Редактировать</button>
</form>
</div>
Controller на добавление
public function create()
{
return view("admin.books.create", [
"book" => [],
"genres" => Genre::get(),
"users" => User::get()
]);
}
public function store(BookFormRequest $request)
{
$book = Book::create($request->validated());
if($request->input('users')){
$book->users()->associate($request->input('users'));
}
if($request->input('genres')){
$book->genres()->attach($request->input('genres'));
}
return redirect(route('books', $book));
}
И редактирование
public function edit($id)
{
$book = Book::findOrFail($id);
return view("admin.books.edit", [
"book" => $book,
"genres" => Genre::get(),
"users" => User::get()
]);
}
public function update(BookFormRequest $request, $id)
{
$book = Book::findOrFail($id);
$book->update($request->validated());
($book->users()->count) ?
$book->users()->update($request->only('users')) :
$book->genres()->detach();
if($request->input('genres')) {
$book->genres()->attach($request->input('genres'));
}
return redirect(route('books'));
}
Ответы (1 шт):
Автор решения: Michael
→ Ссылка
Решение: метод associate, а затем save():
$book->users()->associate($request->input('users'));
$book->save();