Модель - это класс, ассоциированный с именем таблицы из базы данных. Причем, по-умолчанию, имя класса модели равняется имени таблицы из базы из которой убирается окончание “s”. Таким образом, модель Product ассоциирована с таблицей products.
Запросы в таблицу из модели формируются с помощью рассмотреннего ранее построителя запросов.
Для создания моделей у artisan имеется специальная команда.
php artisan make:model Flight
Если модель связывана с таблицей, а миграции создают таблицы, то логично было бы предположить, что имеется специальная комадна связывающая модель с миграцией. Действительно, у artisan имеется специальная команда, создающая сразу два файла: файл модели и файл миграции.
php artisan make:model Flight --migration //или php artisan make:model Flight -m
Не важно, какой командой мы воспользовались, в папке models проекта появится файл Flight.php со следующим содержимым:
namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { // }
В отличии от контроллера, который без методов бесполезен, такой пустой класс модели, мы уже можем использовать. Через данный класс модели, мы можем использовать методы конструктора запросов.
В Laravel имеется встроенная модель User, которая нас связывает с таблице users (используемая в авторизации).
Рассмотрим основные CRUD-операции (Create, Read, Update и Delete).
Извлечение данных
Как только модель определена, у вас всё готово для того, чтобы можно было выбирать и создавать записи. Обратите внимание, что вам нужно создать в этой таблице поля updated_at и created_at. Если вы не хотите, чтобы они были автоматически используемы, установите свойство $timestamps класса модели в false.
Получение всез записей модели
$users = User::all();
Получение записи по первичному ключу:
$user = User::find(1); var_dump($user->name);
Метод find может принимать входящим параметром массив:
$user = User::find([1,2,4]);
Для извлечения данных по другим полям можно воспользоваться методом where
.
$user = User::where(‘email’,$email)->get();
При этом конечный метод get
возвращает массив объектов, для вывода которых в последствии необходимо использовать foreach.
Метод where() может использоваться с тремя входящими параметрами, тогда вторым входящим параметром передается ключевой символ =
, !=
, >
, <
, <>
или ключевое слово LIKE
.
$user = User::where(‘name’,’!=’,$name)->get()
Метод where можно использовать в запросе несколько раз подряд, тогда последующие where работают как AND WHERE.
Множественный вызов метода where:
$user = Tovar::where(‘cat_id’,1)->where(‘showhide’,’show’)->get()
Существует еще один полезный метод, связанный с подзапросом where – это whereIn. WhereIn вторым (или трейтим) входящим параметром принимает массив значений, по которым необходимо формировать запрос.
$models = Model::whereIn('id', [1, 2, 3])->get();
Все методы, доступные в конструкторе запросов, также доступны в запросах с использованием моделей.
Иногда вам нужно возбудить исключение, если определённое значение не найдено, что позволит вам его отловить в обработчике App::error() и вывести страницу 404 («Не найдено»).
$model = User::findOrFail(1); $model = User::where('votes', '>', 100)->firstOrFail();
Вставка
Данные через модель могут быть вставлены двумя способами:
Пример одиночной вставки:
$user = new User; // создаем объект $user->name = 'Джон'; // данные $user->save(); // сохранение
Пример множественной вставки:
User::create(['name'=>'Джон']);
Считается, что способ множественной вставки менее безопасен одиночной. Поэтому для реализации множественной вставки, нужно специальное разрешение модели. В модели нужно объявить свойство $fillable
, содержащее массив элементов полей, разрешенных для вставки.
$fillable = ['name'];
Обновление
Обновление данных по id:
$user = User::find(1); $user->email = 'alex@ya.ru'; $user->save();
Удаление
Удаление данных по id
$user = User::find(1); $user->delete();
Заготовки запросов
Заготовки позволяют повторно использовать логику запросов в моделях. Для создания заготовки просто начните имя метода со scope:
Создание заготовок запроса
class User extends Model { public function scopePopular($query) { return $query->where('votes', '>', 100); } public function scopeWomen($query) { return $query->whereGender('W'); } }
Использование заготовок запросов:
$users = User::popular()->women()->orderBy('created_at')->get();
Можно также использовать заготовки запросов с входящими параметрами:
class User extends Model { public function scopeOfType($query, $type) { return $query->whereType($type); } }
Вызов заготовок запросов с входящими параметрами:
$users = User::ofType('member')->get();
Практика