В 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()— для "многие ко многим".
Выбирайте метод в зависимости от задачи!