Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Модели Eloquent

Eloquent — встроенная в Laravel ORM. Каждой таблице соответствует класс-модель, а каждой строке — объект этого класса. Вместо SQL-запросов вы вызываете методы модели.

Создание модели

php artisan make:model Post

Класс появится в app/Models/Post.php. Модель Post по умолчанию работает с таблицей posts — имя во множественном числе.

namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
}

Чтение записей

use App\Models\Post;
 
$posts = Post::all();   // все записи
$post = Post::find(1);  // запись с id = 1 или null

Столбцы таблицы доступны как свойства объекта:

echo $post->title;

Условия и сортировка

Запрос собирают цепочкой методов и завершают методом get() или first():

$posts = Post::where('is_published', true)
    ->orderBy('created_at', 'desc')
    ->limit(10)
    ->get();
 
$post = Post::where('slug', 'hello')->first();

Создание записи

$post = new Post();
$post->title = 'Первая статья';
$post->body = 'Текст статьи';
$post->save();

Столбцы created_at и updated_at Laravel заполнит сам.

Массовое заполнение

Запись можно создать одним вызовом create(). Для этого в модели перечисляют столбцы, которые разрешено заполнять массивом:

class Post extends Model
{
    protected $fillable = ['title', 'body'];
}
$post = Post::create([
    'title' => 'Вторая статья',
    'body' => 'Текст статьи',
]);

Изменение и удаление

$post = Post::find(1);
$post->title = 'Новый заголовок';
$post->save();
 
$post->delete();

Запись или ошибка 404

Метод findOrFail() возвращает запись, а если её нет — показывает страницу 404. В контроллере это избавляет от проверки на null:

public function show(string $id)
{
    $post = Post::findOrFail($id);
 
    return view('posts.show', ['post' => $post]);
}

Частая ошибка

Если вызвать create() для модели без $fillable, Laravel выбросит исключение MassAssignmentException. Это защита: без неё пользователь мог бы прислать в форме лишнее поле, например is_admin, и оно попало бы в базу. Перечисляйте в $fillable только те столбцы, которые можно заполнять из формы.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.