Eloquent

09 Сентября 2021 12:43

Модели

Модели расширяют класс Illuminate\Database\Eloquent\Model.

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

Чтобы создать модель нужно воспользоваться командой:

php artisan make:model Posts

Файл модели будет помещен в директорию App/Models/.

При запуске команд на создание моделей, можно использовать различные флаги:

Создать Модель и Миграцию

php artisan make:model Posts --migration
php artisan make:model Posts --m

Создать Модель и Фабрику

php artisan make:model Posts --factory
php artisan make:model Posts -f

Создать Модель и Сидер 

php artisan make:model Posts --seed
php artisan make:model Posts -s

Создать Модель и Контроллер

php artisan make:model Posts --controller
php artisan make:model Posts -c

Создать Модель и Политику

php artisan make:model Posts --policy

Создать Модель, Миграцию, Фабрику, Сидер, Контроллер

php artisan make:model Posts -mfsc

Создать всё

php artisan make:model Posts --all

Параметры модели

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TasksItem extends Model
{
  //Использовать программное удаление. Добавляет поле deleted_at, в которое вносится дата удаления
  use SoftDeletes;

  //Имя, связанной с моделью, таблицы. По умолчанию, имя модели переводится из camelCase в snake_case и это будет названием таблицы.
  protected $table = 'tasks_item';

  //Определяет необходимость отметок времени для модели - created_at, updated_at, deleted_at.
  public $timestamps = true;

  //Формат хранения отметок времени модели.
  protected $dateFormat = 'U';

  //Указать названия полей меток времени
  const CREATED_AT = 'creation_date';
  const UPDATED_AT = 'last_update';

  //Настройка формата времени
  protected function getDateFormat()
  {
    return 'U';
  }

  //Название соединения для модели.
  protected $connection = 'connection-name';
}

 

Конструктор запросов

Элементы запроса

Метод Варианты Описание
select('name', 'email as user_email')   Указываем поля для выборки. Можно использовать MySQL функции и присваивать алиасы через as.
addSelect('age')   Добавить поле для select, если уже запрос сформирован. Полезно при написании мудрёных скриптов, формирующих запросы.
join()   INNER JOIN из MySQL
leftJoin()   LEFT JOIN из MySQL
crossJoin()   CROSS JOIN из MySQL
where($key, $value)   Оператор WHERE в MySQL. Для самого простого варианта использования - первым параметром передается имя поля, вторым параметром искомое значение.
Можно передать 3 параметра, где 1 - поле, 2 - оператор, 3 - искомое значение
  where('votes', '>=', 100)  
  where('votes', '<>', 100)  
  where('name', 'like', 'T%')  
  where([ ['status', '=', '1'], ['subscribed', '<>', '1'], ])  
orWhere('name', 'John')   Оператор OR в MySQL. Принимает теже параметры, что и where()
whereBetween('votes', [1, 100])   Оператор BETWEEN в MySQL. Проверяет, что значения находятся в указанном интервале
whereNotBetween('votes', [1, 100])   Проверяет, что значения находятся вне указанного интервала
whereIn('id', [1, 2, 3])   Оператор IN в MySQL
whereNotIn('id', [1, 2, 3])   Оператор NOT IN в MySQL
whereNull('updated_at')   Проверяет, что значение поля равно NULL
whereNotNull('updated_at')   Проверяет, что значение поля не равно NULL
distinct()   Только уникальные значения
groupBy('status')    
take() / limit()   LIMIT из MySQL

Методы получения данных

Это окончательные методы для отправки запроса и получения данных, прописываются последними в формировании запроса

Метод Описание
first() Получить первую модель, соответствующую условию запроса
find() Найти только одну запись
findOrFail() Если результат не найден, будет выброшено исключение. Если исключение не перехвачено то будет осуществлен переход на страницу 404
get() Получить все строки
pluck('title', 'name') Получить массив значений одного или нескольких полей. Параметрами передаются имена полей

Аггрегатные методы

Также, вызываются в конце запроса и предназначены для получения данных, но уже с конкретными условиями

Метод Описание

count()

Получить подсчитанное количество результатов
min() Получить минимальное значение из выборки
max() Получить максимальное значение из выборки
avg() Получить среднее значение из выборки
sum() Получить сумму значений в выборке

Методы внесения/обновления данных

Метод Описание
save() Сохраняет данные в БД.
updateOrCreate() Обновляет существующую запись, а при ее отсутствии создает новую

Методы удаления данных

Метод Описание
delete() Удаляет существующий элемент
destroy() Удаляет существующий элемент по первичному ключу (id)

Примеры получения данных

1. Получить все записи

<?php

$posts = Posts::all();

2. Получить 10 последних записей.

<?php

$posts = Posts::where('published', 1)
               ->orderByDesc('publishedon')
               ->take(10)
               ->get();

Примеры внесения данных

1. Добавить строку в БД на основе данных

public function store(Request $request)
  {
      // Валидация запроса ...

      $post = new Post;

      $post->name = $request->title;

      $post->save();
  }

Примечание. Временные метки timestamps устанавливаются автоматически, если они не были исключены в модели.

2. Альтернативный метод create() для внесения данных

$post = Post::create([
    'title' => 'Test title',
]);

Примечание. При использовании этого метода, в модели должно быть определено свойство $fillable или $guarded во избежание массового присвоения.

Примеры обновления данных

public function update (Request $request)
{
    // Валидация запроса ...

    $post= Post::find(1);

    $post->title = $request->title;

    $post->save();
}

Коллекции

При получении данных из базы возвращается экземпляр класса Illuminate\Database\Eloquent\Collection

Методы

1. reject();

Обходит все элементы и убирает из выборки те, на которых callback-функция вернула true. Таким образом, можно убирать из коллекции элементы, основываясь на значении полей в базе.

<?php

$posts = Posts::where('published', 1)->get();

$posts = $posts->reject(function($post) {
    return $post->hide_in_menu;
});