Top.Mail.Ru
Ответы

Laravel. Не добавляется запись в связующую таблицу

Есть маленький скрипт для работы с постами, и у которых может быть несколько авторов.

Присутствуют 3 таблицы:
posts (id, title, content),
authors (id, name),
author_posts (id, post_id, author_id)

Модели:
Post

1234567891011
 class Post extends Model 
{ 
    use HasFactory; 
 
    protected $fillable = ['title', 'content']; 
 
    public function authors(): BelongsToMany 
    { 
        return $this->belongsToMany(Author::class, 'author_posts'); 
    } 
} 


Author

12345678910
 class Author extends Model 
{ 
    use HasFactory; 
 
    public function posts(): BelongsToMany 
    { 
        return $this->belongsToMany(Post::class, 'author_posts'); 
    } 
} 
 

В контроллере PostController у меня есть экшн для привязки автора к посту:

12345678910
     public function attachAuthor(Post $post, Request $request) 
    { 
        $data = $request->validate([ 
            'authorId' => 'required|exists:authors,id', 
        ], $request->all()); 
 
        $post->authors()->attach($data['authorId']); 
 
        dump($post->authors); 
    } 

attach отрабатывает, на выводе dump возвращает список. В котором есть добавленный автор. Но по факту в связующую таблицу ничего не добавляется.

В чем может быть причина?

По дате
По рейтингу
Аватар пользователя
Ученик
7мес

Потому что ларка, переходите на Yii2

Аватар пользователя
Оракул
7мес

Метод validate принимает только правила валидации, а вы передаете вторым параметром данные. Это неправильно.

Исправленный вариант контроллера:

1234567891011121314
 public function attachAuthor(Post $post, Request $request)  
{  
    $data = $request->validate([  
        'authorId' => 'required|exists:authors,id' 
    ]);  
 
    $post->authors()->attach($data['authorId']);  
 
    return response()->json([ 
        'success' => true, 
        'authors' => $post->authors()->get() 
    ]); 
}