Глосcарий Модели

Модель - это класс, ассоциированный с именем таблицы из базы данных.

Причем, по-умолчанию, имя класса модели равняется имени таблицы из базы из которой убирается окончание “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();

--