Работа с моделями и базой данных в Laravel 5, добавление, изменение, условия и удаление

  • DeveloperNotes
  • »
  • Laravel 5
  • »
  • Работа с моделями и базой данных в Laravel 5, добавление, изменение, условия и удаление

В Laravel 5 для работы с базой данных используются так называемые модели (models). Это разновидность ORM (англ. Object-Relational Mapping) и в данном случае за это отвечает Eloquent ORM. А "разновидность" конкретно здесь называется Active Reacord. Чтобы не вгонять читателя в тоску, скажу проще: мы можем связать строку в нашей базе данных с объектом класса Model в нашем коде.

То есть, если у вас есть вот такая таблица с продуктами (products):

idtitlecreated
1Стол2019-11-11 01:00:00
2Стул2019-11-12 02:00:00

То мы можем создать объект, который отвечает за строки этой таблицы и получить все данные по второй строке, например, вот так:

echo $product2->title;

И на экране мы увидим "Стул", как и задумывалось. А обновить его можно еще проще:

$product2->title = "Торшер";
$product2->save();

Теперь вместо стула у нас продается торшер. Но давайте разберем всё с самого начала и до конца.

 

Как создать модель в Laravel 5?

Чтобы создать модель, необходимо открыть в терминале каталог с нашим проектом и выполнить команду artisan вот так:

cd /home/www/your_project/public_html
php artisan make:model Product

Где "Product" - это название нашей модели. Так будет называться класс (class Product) и файл модели (Product.php).

По умолчанию все наши модели будут попадать в каталог app. На мой взгляд, это не очень хорошо, т.к. моделей на проекте может быть много или даже очень много. Поэтому перенесем их в специальный каталог.

Как создавать таблицы для моделей в Laravel 5?

Во время создания модели можно сразу же указать Laravel, что мы хотим создать миграцию для этой модели. Например, вот так:

php artisan make:model Product --migration

или более коротко:

php artisan make:model Product -m

Сейчас у меня нет статьи на эту тему, но замечу, что в Laravel таблицы в базе данных нужно создавать не напрямую, а через так называемые "миграции". Этот механизм уже встроен в Laravel и он достаточно прост для понимания. Я предлагаю обратиться к официальной документации для того, чтобы узнать, как создавать таблицы, а потом вернуться к данной статьей.

Как перенести модели Laravel в каталог?

Создайте в каталоге app подкаталог Models (с большой буквы). И перенесите туда созданную модель Product.php.

Далее нам нужно немного подредактировать исходный код модели, чтобы она правильно работала. Измените namespace в начале файла на нужный нам:

namespace App\Models;

Теперь он указывает на наш каталог. Далее необходимо сгенерировать заново весь список autoload-файлов (если вдруг Laravel не видит модель после изменения ее каталога):

cd /home/www/your_project/public_html
composer dumpautoload

Это пересоздаст список загружаемых файлов при старте нашего приложения.

Как сделать новую запись в базу в Laravel 5?

Теперь предположим, что мы хотим добавить новый продукт в базу данных. Таблица уже была преведена выше. Сделать это можно следующим образом:

$product = new Product();
$product->title = "Торшер";
$product->created = "2019-10-10 15:10:00";
$product->save();

Сразу же после выполнения save() у нас появится новая строка в базе данных. Обратите внимание, что мы создали новый объект класса Product(), ничего не передавая в конструктор. И нам не приходилось указывать id нового продукта. Laravel сделал всё за нас!

Как получить данные из базы в Laravel 5?

Для этого мы тоже будем использовать модель. Например, пусть мы хотим получить все продукты, которые у нас есть и обработать их в цикле:

$products = App\Models\Product::all();

foreach ($products as $product) {
    echo $product->name;
}

Мы обратились к статическому методу модели Product, который был получен после наследования от класса Illuminate\Database\Eloquent\Model. В данном случае мы получили все записи из базы. ОБращаю ваше внимание, что это достаточно затратная операция, если база большая. А все данные будут храниться в оперативной памяти. Поэтому, если у вас большая таблица - лучше так не делать, а разбить получаемые данные на так называемые "чанки".

Обработка модели по частям (чанки) в Laravel 5

Обработка моделей по частям нужна для повышения производительности нашего приложения, когда необходимо обработать большое (или даже огромное) количество данных. Хотя теперь мы и не потребляем много ресурсов компьютера, помните, что подобное действие может выполняться долго.

Product::chunk(200, function ($products) {
    foreach ($products as $product) {
        // обработка продуктов
    }
});

Это спасает в ситуациях, например, если на вашем сайте 400.000 страниц и необходимо построить для них sitemap.xml. Если делать это с помощью all(), вы нагрузите процессор и оперативную память по-максимуму. В этом случае вряд ли нагрузка на процессор будет составлять больше процента.

Условия (where) для моделей в Laravel 5

Чтобы добавить условие при получении моделей, мы должны использовать метод where(). Кроме того, мы больше не можем использовать метод all(), т.к. он получает модели без условий. Сделать это можно, например, вот так:

$products = App\Models\Product::where('title', '=', 'Стул')->get();

Таким образом $products будет содержать все продукты, у которых название совпадает со словом "Стул". Теперь мы можем вывести все стулья на страницу сайта в цикле, как было показано выше.

Коллекция моделей и count() в Laravel 5

То, что мы получаем в результате методов get() и all() на самом деле является не массивом, а коллекцией моделей. К коллекции можно применить функцию count() и посчитать количество моделей. Разница с массивом состоит в том, что коллекция - это объект.

Для коллекции моделей будут работать оба способа подсчета количества ее содержимого:

count($products);
$products->count();

Как указывает документация по PHP, чтобы применить фукнцию count() к объекту, он должен имплементировать интерфейс Countable и "объяснить" PHP какой метод вызывать при подсчете количества элементов. Поэтому, на самом деле, когда вы вызываете count($products), то по факту вызывается $products->count().

Получение одиночной модели (одной записи из базы) в Laravel 5

Очень часто возникает необходимость получить только одну запись из базы данных по определенному условию. Для этого можно использовать следующую конструкцию:

$product = App\Models\Product::where('title', '=', 'Стул')->first();

Таким образом мы получим первую модель, которая удовлетворяет нашему условию.

Очень часто нам нужно получить модель по primary key (как говорится - "по айдишнику"). В данном случае можно сократить запись и не использовать условия, а написать вот так:

$product = App\Models\Product::find(1);

Это аналог следующего кода:

$product = App\Models\Product::where('id', '=', 1)->first();

Обращаю ваше внимание, что если вы будете использовать get() вместо first(), то вы получите коллекцию моделей, состояющую из одной модели, а не саму модель!

Обновление моделец (записей в базе) в Laravel 5

Кроме создания новой модели и ее сохранения, мы можем также обновить данные в ней, как только она получена. Предположим, что мы получили модель $product из предыдущего примера. Тогда обновить записи в базе можно следующим образом:

$product = App\Models\Product::find(1);
$product->title = "Наковальня";
$product->save();

Таким образом мы изменили поле title для модели с id равным единице в базе.

Как удалить модель (строку из базы) в Laravel 5?

И завершим эту тему удалением строки из базы данных. Опять предположим, что мы хотим удалить запись из базы, где id = 1.

$product = App\Models\Product::find(1);
$product->delete();

Таким образом мы удалим запись, у которой id был равен единице.

Кроме того можно удалить все строки из базы данных по определенному условию. Для этого применим другой метод - delete(). Обратите внимание, что в качестве результата нам вернется коллекций удаленных моделей. Это полезно, если вы, к примеру, хотите их не только удалить, но и перенести в другую таблицу.

$deletedProducts = App\Models\Product::where('title', 'Стул')->delete();

В переменной $deletedProducts теперь будет находиться коллекция удаленных моделей.

Комментарии

Комментариев пока нет. Станьте первым! Конечно, если вы не хотите написать мне гадости.
Обязательное поле.
Подсказка по Markdown, используется для оформления.

DeveloperNotes.ru © 2018 — 2020