Модели 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 только те столбцы, которые можно заполнять из формы.