atom1c.ru

Методы добавления записей в Laravel: Обычные и с отношениями

В 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() — для "многие ко многим".

Выбирайте метод в зависимости от задачи!