В Laravel существует несколько способов добавления записей в базу данных. В этой статье мы разберем, как создавать обычные записи с помощью create(), save() и insert(), а также рассмотрим добавление данных с отношениями "один ко многим" и "многие ко многим" с использованием saveMany(), attach(), sync() и других методов. Подробные примеры помогут вам легко освоить работу с Eloquent и эффективно управлять связями между моделями. 🚀
1. Обычное добавление записи
Самый простой способ добавить запись в базу данных — использовать метод create()
или save()
.
Способ 1: Использование create()
Метод create()
позволяет массово заполнять поля, но для этого в модели нужно указать fillable
или guarded
.
Пример модели (app/Models/Post.php
):
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'content']; // Разрешенные для массового заполнения поля
}
Пример добавления записи в контроллере:
use App\Models\Post;
$post = Post::create([
'title' => 'Первая запись',
'content' => 'Это содержимое записи'
]);
Важно! Метод
create()
работает только если в модели указаныfillable
илиguarded
.
Способ 2: Использование save()
Метод save()
сохраняет запись после установки значений атрибутов.
$post = new Post();
$post->title = 'Вторая запись';
$post->content = 'Текст второй записи';
$post->save();
Способ 3: Использование insert()
Метод insert()
выполняет вставку напрямую в базу данных и не использует модель.
use Illuminate\Support\Facades\DB;
DB::table('posts')->insert([
'title' => 'Третья запись',
'content' => 'Текст третьей записи'
]);
Недостаток: При использовании
insert()
не вызываются события модели (например,created
).
2. Добавление записи с отношениями
В Laravel можно добавлять записи одновременно с их связанными моделями, если между ними установлены отношения.
Пример: Post
и Comment
(Связь "один ко многим")
Предположим, у нас есть две модели:
-
Post
(пост) — главная модель. -
Comment
(комментарий) — связанная модель.
Модель Post
(app/Models/Post.php
):
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'content'];
public function comments()
{
return $this->hasMany(Comment::class);
}
}
Модель Comment
(app/Models/Comment.php
):
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
use HasFactory;
protected $fillable = ['post_id', 'text'];
public function post()
{
return $this->belongsTo(Post::class);
}
}
Добавление комментария к посту
Способ 1: Использование save()
$post = Post::find(1); // Находим пост
$comment = new Comment();
$comment->text = 'Отличная статья!';
$post->comments()->save($comment);
Способ 2: Использование create()
$post = Post::find(1);
$post->comments()->create([
'text' => 'Спасибо за полезную информацию!'
]);
Важно! Метод
create()
работает только если в моделиComment
указаныfillable
.
Способ 3: Массовое добавление связанных записей
Можно добавить сразу несколько комментариев:
$post = Post::find(1);
$post->comments()->createMany([
['text' => 'Первый комментарий'],
['text' => 'Второй комментарий']
]);
3. Добавление записи с отношением "многие ко многим"
Предположим, у нас есть две модели:
-
Post
(пост) -
Tag
(тег)
Они связаны отношением "многие ко многим", через таблицу post_tag
.
Модель Post
(app/Models/Post.php
):
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'content'];
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}
Модель Tag
(app/Models/Tag.php
):
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function posts()
{
return $this->belongsToMany(Post::class);
}
}
Добавление тегов к посту
Способ 1: attach()
(Привязка существующих тегов)
$post = Post::find(1);
$post->tags()->attach([1, 2, 3]); // Привязываем теги с ID 1, 2, 3
Способ 2: sync()
(Обновление привязанных тегов)
$post->tags()->sync([2, 3, 4]); // Заменит текущие связи
Способ 3: syncWithoutDetaching()
(Добавление новых тегов без удаления старых)
$post->tags()->syncWithoutDetaching([4, 5]);
Способ 4: Добавление новых тегов вместе с постом
$post = Post::create([
'title' => 'Пост с тегами',
'content' => 'Содержимое поста'
]);
$tags = Tag::whereIn('name', ['Laravel', 'PHP'])->get();
$post->tags()->saveMany($tags);
Вывод
В Laravel есть несколько способов добавления записей, в зависимости от ситуации:
-
create()
— массовое заполнение (требуетfillable
). -
save()
— сохранение модели по одному. -
insert()
— прямое добавление в базу (без моделей). -
saveMany()
иcreateMany()
— массовое добавление в отношения "один ко многим". -
attach()
,sync()
,syncWithoutDetaching()
— для "многие ко многим".
Выбирайте метод в зависимости от задачи!