Настраиваем вашу первую модель laravel 4

Содержание

Введение

Миграции — что-то вроде системы контроля версий для вашей базы данных. Они позволяют вашей команде изменять структуру БД, в то же время оставаясь в курсе изменений других участников. Миграции обычно идут рука об руку с построителем структур для более простого обращения с архитектурой вашей базы данных. Если вы когда-нибудь просили коллегу вручную добавить столбец в его локальную БД, значит вы сталкивались с проблемой, которую решают миграции БД.


Фасад Laravel обеспечивает поддержку создания и изменения таблиц в независимости от используемой СУБД из числа тех, что поддерживаются в Laravel.

Введение

Laravel делает взаимодействие с базами данных чрезвычайно простым в различных бэкэндах баз данных — будь то сырой SQL, построитель запросов или Eloquent ORM. На данный момент Laravel поддерживает четыре системы баз данных:

  • MySQL 5.6+ ()
  • PostgreSQL 9.4+ (Version Policy)
  • SQLite 3.8.8+
  • SQL Server 2017+ (Version Policy)

Настройка

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

По умолчанию Laravel уже готова к использованию с Laravel Homestead — удобной виртуальной машиной для Laravel-разработки на вашей локальной машине. Разумеется, вы можете изменить эти настройки для работы с вашей локальной БД.

Настройка SQLite

После создания новой базы данных SQLite при помощи команды , вы можете настроить переменные вашей среды для этой новой базы данных, используя её абсолютный путь:

To enable foreign key constraints for SQLite connections, you should set the environment variable to :

Настройка с использованием URL

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

Некоторые облачные провайдеры баз данных, такие как Heroku, предоставляют единый URL базы данных, который содержит всю информацию о подключении к базе данных в одной строке. Пример URL базы данных может выглядеть следующим образом:

Эти URL обычно следуют стандартной схеме:

Для удобства Laravel поддерживает эти URL-адреса в качестве альтернативной настройке вашей базы данных с несколькими вариантами конфигурации. Если присутствует конфигурационная опция (или соответствующая переменная окружения ), то она будет использоваться для извлечения информации о подключении к БД и учетных данных.

Настройка SQL Server

Laravel изначально поддерживает работу с SQL Server; однако, потребуется добавить настройку подключения к БД в конфиге :

Соединения для чтения и записи

Иногда вам может понадобиться использовать разные подключения к базе данных: одно для запросов SELECT, а другое для запросов INSERT, UPDATE и DELETE

это делается очень просто, и всегда будет использоваться соответствующее соединение, неважно используете ли вы сырые sql-запросы, построитель запросов Laravel или Eloquent ORM

Чтобы увидеть, как должны быть настроены соединения чтения/записи, давайте взглянем на этот пример:

Обратите внимание, что в массив настроек были добавлены три элемента: , и. Первые два элемента представляют собой массив с одним элементом:

Остальные параметры БД для подключений чтения/записи будут заимствованы из основного массива .

Вам стоит размещать элементы в массивах и aтолько если вы хотите переопределить их значения из основного массива. Таким образом, в этом случае, будет использоваться как хост для подключения «чтения», а — для подключения «записи». Учётные данные для БД, префикс, набор символов, и все другие параметры основного массива будут использованы для обоих подключений.

Размещать элементы в массивах и нужно только в том случае, если вы хотите переопределить значения из главного массива. Таким образом, в этом случае, будет использоваться в качестве хоста для соединения для чтения, а — для соединения для записи. Остальные опции будут совместно использоваться для обоих соединений.

Опция

Опция является опциональным значением. Если опция включена и в течение текущего цикла работы с БД была выполнена операция «запись», то при любых дальнейших операциях «чтения» будет использоваться соединение «запись». Это гарантирует, что любые данные, записанные во время цикла запроса, могут быть немедленно считаны из БД во время того же самого запроса. Вы сами решаете, является ли это желаемым поведением вашего приложения.

Использование нескольких соединений с БД

При использовании нескольких соединений с БД вы можете получить доступ к каждому из них через метод фасада . Передаваемое в этот метод имя должно соответствовать одному из перечисленных в файле :

Вы также можете получить низкоуровневый объект PDO для этого подключения методом на экземпляре подключения:

Отношения моделей Laravel

Третья и последняя характеристика модели — это то, что она содержит информацию, описывающую взаимодействие бизнес-объектов друг с другом.

Описать отношения двух моделей так же просто, как создать новый метод класса.

Добавьте следующий метод в вашу модель User.php:

Этот крайне простой метод — единственное, что вам нужно написать, для того, чтобы сказать, что «пользователь имеет много сообщений».

Конечно, теперь вам надо создать модель сообщения, для того чтобы это заработало. Я не буду описывать создание миграции (migration) и модели сообщения. Вместо этого вернитесь к уроку «Миграции в Laravel 4». Я просто создам столбцы body и user_id для моей модели сообщения. Вот команда миграции, которую я выполнил:

Таким образом, ваша базовая модель сообщения должна выглядеть так:

Обратите внимание, как я задал обратное отношение в методе. Это значит, что каждый пост принадлежит пользователю.. Далее создайте новый тестовый маршрут в app/routes.php и вставьте следующее:

Далее создайте новый тестовый маршрут в app/routes.php и вставьте следующее:

Теперь, если вы посмотрите в таблицу сообщений в вашей БД, вы увидите, что сообщение сохранено и полю user_id автоматически присвоен идентификатор пользователя (1).

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

Столбцы

Создание столбцов

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

Доступные типы столбцов

Разумеется, построитель структур содержит различные типы столбцов, которые вы можете указывать при построении ваших таблиц:

Команда Описание
Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED BIG INTEGER».
Эквивалент BIGINT для базы данных.
Эквивалент BLOB для базы данных.
Эквивалент BOOLEAN для базы данных.
Эквивалент CHAR для базы данных.
Эквивалент DATE для базы данных.
Эквивалент DATETIME для базы данных.
Эквивалент DATETIME (с часовым поясом) для базы данных.
Эквивалент DECIMAL с точностью и масштабом.
Эквивалент DOUBLE с точностью, всего 15 цифр, после запятой 8 цифр.
Эквивалент ENUM для базы данных.
Эквивалент FLOAT для базы данных, всего 8 знаков, из них 2 после запятой.
Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED INTEGER».
Эквивалент INTEGER для базы данных.
Эквивалент IP-адреса для базы данных.
Эквивалент JSON для базы данных.
Эквивалент JSONB для базы данных.
Эквивалент LONGTEXT для базы данных.
Эквивалент MAC-адреса для базы данных.
Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED MEDIUM INTEGER».
Эквивалент MEDIUMINT для базы данных.
Эквивалент MEDIUMTEXT для базы данных.
Добавление столбца INTEGER и STRING.
Аналогично , но разрешено значение NULL.
Аналогично , но разрешено значение NULL.
Добавление столбца как VARCHAR(100) NULL.
Инкрементный ID (первичный ключ), использующий эквивалент «UNSIGNED SMALL INTEGER».
Эквивалент SMALLINT для базы данных.
Добавление столбца для мягкого удаления с разрешенным значением NULL.
Эквивалент VARCHAR.
Эквивалент VARCHAR с длиной.
Эквивалент TEXT для базы данных.
Эквивалент TIME для базы данных.
Эквивалент TIME (с часовым поясом) для базы данных.
Эквивалент TINYINT для базы данных.
Эквивалент TIMESTAMP для базы данных.
Эквивалент TIMESTAMP (с часовым поясом) для базы данных.
Добавление столбцов и с разрешенным значением NULL.
Добавление столбцов и (с часовым поясом), для которых разрешено значение NULL.
Эквивалент Unsigned BIGINT для базы данных.
Эквивалент Unsigned INT для базы данных.
Эквивалент Unsigned MEDIUMINT для базы данных.
Эквивалент Unsigned SMALLINT для базы данных.
Эквивалент Unsigned TINYINT для базы данных.
Эквивалент UUID для базы данных.

Модификаторы столбцов

Вдобавок к перечисленным типам столбцов существует несколько «модификаторов» столбцов, которые вы можете использовать при добавлении столбцов в таблицу. Например, чтобы сделать столбец «обнуляемым», используйте метод :

Ниже перечислены все доступные модификаторы столбцов. В этом списке отсутствуют :

Модификатор Описание
Помещает столбец «после» указанного столбца (только MySQL)
Добавляет комментарий в столбец
Указывает значение «по умолчанию» для столбца
Помещает столбец «первым» в таблице (только MySQL)
Разрешает вставлять значения NULL в столбец
Создать генерируемый столбец типа stored (только MySQL)
Делает столбцы беззнаковыми
Создать генерируемый столбец типа virtual (только MySQL)

Изменение столбцов

Требования

Перед изменением столбцов добавьте зависимость в свой файл . Библиотека Doctrine DBAL используется для определения текущего состояния столбца и создания SQL-запросов, необходимых для выполнения указанных преобразований столбца:

Изменение атрибутов столбца

Метод позволяет изменить тип существующего столбца или изменить его атрибуты. Например, если вы захотите увеличить размер строкового столбца с 25 до 50:

Также мы можем изменить столбец, чтобы он могу иметь значения NULL:

Переименование столбцов

Для переименования столбца используйте метод на построителе структур. Перед переименованием столбца добавьте зависимость в свой файл :

Удаление столбцов

Для удаления столбца используйте метод на построителе структур. Перед удалением столбцов из базы данных SQLite вам необходимо добавить зависимость в ваш файл и выполнить команду для установки библиотеки:

Вы можете удалить несколько столбцов таблицы, передав массив их имён в метод :

Creating Views

Views contain the HTML served by your application and separate your controller / application logic from your presentation logic. Views are stored in the directory. A simple view might look something like this:

Since this view is stored at , we may return it using the global helper like so:


As you can see, the first argument passed to the helper corresponds to the name of the view file in the directory. The second argument is an array of data that should be made available to the view. In this case, we are passing the variable, which is displayed in the view using Blade syntax.

Views may also be nested within subdirectories of the directory. «Dot» notation may be used to reference nested views. For example, if your view is stored at , you may reference it like so:

Creating The First Available View

Using the method, you may create the first view that exists in a given array of views. This is useful if your application or package allows views to be customized or overwritten:

You may also call this method via the facade:

Установка

Требования к серверу

Фреймворк Laravel предъявляет некоторые системные требования. Конечно же, виртуальная машина Laravel Homestead соответствует всем этим требованиям, поэтому настоятельно рекомендуется использовать Homestead в качестве основной локальной среды разработки с Laravel.

Однако, если вы не используете Homestead, вам необходимо убедиться, что ваш сервер соответствует следующим требованиям:

  • PHP >= 7.2.0
  • Расширение PHP BCMath
  • Расширение PHP Ctype
  • Расширение PHP Fileinfo
  • Расширение PHP JSON
  • Расширение PHP Mbstring
  • Расширение PHP OpenSSL
  • Расширение PHP PDO
  • Расширение PHP Mbstring
  • Расширение PHP Tokenizer
  • Расширение PHP XML

Установка Laravel

Laravel использует Composer для управления своими зависимостями, поэтому убедитесь в том, что Composer установлен на вашей машине.

С помощью установщика Laravel

Сначала скачайте установщик Laravel с помощью Composer:

Проверьте, чтобы директория composer’а находилась в переменной $PATH, что позволит вашей системе найти и выполнить команду . Эта директория располагается в разных местах в зависимости от вашей операционной системы, но обычно она находится тут:

  • macOS:
  • Windows:
  • Linux: или

Также вы можете определить директорию выполнив команду (смотрите первую строчку вывода).

После установки команда создаёт свежую установку Laravel в указанной вами директории. Например, создаст директорию с названием , которая будет содержать свежую установку Laravel со всеми зависимостями:

Локальный сервер разработки

Если локально у вас уже установлен PHP и вы хотели бы использовать встроенный сервер для работы вашего приложения, то вы можете использовать команду Artisan . Эта команда запустит сервер разработки по адресу :

Конечно же, Homestead и Valet предоставляют наиболее надежные способы локальной разработки.

Настройка

Общедоступная директория

После установки Laravel вам следует указать директорию в качестве корневой директории вашего веб-сервера. Файл в этой категории выступает в роли фронт-контроллера всех HTTP-запросов, поступающих в ваше приложение.

Файлы настройки

Все файлы настройки фреймворка Laravel расположены в директории . Параметры в каждом из них снабжены комментариями, поэтому не стесняйтесь пройтись по этим файлам и познакомиться с доступными параметрами настройки.

Права доступа на директории

Так же, после установки Laravel вам может потребоваться настройка некоторых прав доступа. Директории внутри и должны быть доступны для записи веб-сервером, в противном случае Laravel не запустится. Если вы используете виртуальную машину Homestead, то эти права доступа уже установлены.

Ключ приложения

Следующее, что вы должны сделать после установки Laravel, это создать ключ шифрования для вашего приложения в виде случайного набора символов. Если вы установили Laravel через Composer или установщик Laravel, то этот ключ уже был создан с помощью команды .

Как правило, это строка должна быть длиной в 32 символа. Ключ должен быть указан в параметре файла окружения . Если вы не переименовывали файл в , то следует сделать это сейчас. Если ключ приложения не создан, то сессии ваших пользователей и другие шифруемые данные не будут в безопасности!

Дополнительная настройка

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

Вы также можете настроить некоторые дополнительные компоненты Laravel, такие как:

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

Проверка подлинности пользователя требуется почти в каждом современном веб-приложении. Вместо того чтобы заставлять вас писать свою собственную модель пользователя, в Laravel 4 уже есть модель пользователя прямо из коробки.

Если вы зайдете в каталог app/models, то найдете там файл User.php. Все ваши модели должны помещаться в этом каталоге и именоваться таким же образом. Например, в вашем приложении есть модель для сообщений, тогда файл модели будет называться app/models/Post.php.

Между прочим, вам не обязательно следовать этому правилу, есть способы его обойти, но я не представляю, зачем вам это может понадобиться.

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

Deleting Models

To delete a model, call the method on a model instance:

Deleting An Existing Model By Key

In the example above, we are retrieving the model from the database before calling the method. However, if you know the primary key of the model, you may delete the model without explicitly retrieving it by calling the method. In addition to a single primary key as its argument, the method will accept multiple primary keys, an array of primary keys, or a collection of primary keys:

Deleting Models By Query

You can also run a delete statement on a set of models. In this example, we will delete all flights that are marked as inactive. Like mass updates, mass deletes will not fire any model events for the models that are deleted:

Soft Deleting

In addition to actually removing records from your database, Eloquent can also «soft delete» models. When models are soft deleted, they are not actually removed from your database. Instead, a attribute is set on the model and inserted into the database. If a model has a non-null value, the model has been soft deleted. To enable soft deletes for a model, use the trait on the model:

You should also add the column to your database table. The Laravel schema builder contains a helper method to create this column:

Now, when you call the method on the model, the column will be set to the current date and time. And, when querying a model that uses soft deletes, the soft deleted models will automatically be excluded from all query results.

To determine if a given model instance has been soft deleted, use the method:

Querying Soft Deleted Models

Including Soft Deleted Models

As noted above, soft deleted models will automatically be excluded from query results. However, you may force soft deleted models to appear in a result set using the method on the query:

The method may also be used on a relationship query:

Restoring Soft Deleted Models

Sometimes you may wish to «un-delete» a soft deleted model. To restore a soft deleted model into an active state, use the method on a model instance:

You may also use the method in a query to quickly restore multiple models. Again, like other «mass» operations, this will not fire any model events for the models that are restored:


Like the method, the method may also be used on relationships:

Permanently Deleting Models

Sometimes you may need to truly remove a model from your database. To permanently remove a soft deleted model from the database, use the method:

Транзакции БД

Для выполнения набора запросов внутри одной транзакции вы можете использовать метод фасада . Если в функции-замыкании произойдёт исключение, транзакция автоматически откатится. А если функция выполнится успешно, транзакция автоматически применится к БД:

Обработка взаимных блокировок

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

Ручное использование транзакций

Если вы хотите запустить транзакцию вручную и иметь полный контроль над её откатом и применением, используйте метод фасада :

Вы можете откатить транзакцию методом :

Наконец, вы можете применить транзакцию методом :

Условия Where

Простые условия Where

Для добавления в запрос условий используйте метод на экземпляре конструктора запросов. Самый простой вызов требует три аргумента. Первый — имя столбца. Второй — оператор (любой из поддерживаемых базой данных). Третий — значение для сравнения со столбцом.

Например, вот запрос, проверяющий равенство значения столбца «votes» и 100:

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

Разумеется, вы можете использовать различные другие операторы при написании условия :

В функцию также можно передать массив условий:

Условия Or

Вы можете сцепить вместе условия where, а также добавить условия к запросу. Метод принимает те же аргументы, что и метод :

Дополнительные условия Where

whereBetween

Метод проверяет, что значение столбца находится в указанном интервале:

whereNotBetween

Метод проверяет, что значение столбца находится вне указанного интервала:

whereIn / whereNotIn

Метод проверяет, что значение столбца содержится в данном массиве:

Метод проверяет, что значение столбца не содержится в данном массиве:

whereNull / whereNotNull

Метод проверяет, что значение столбца равно :

Метод проверяет, что значение столбца не равно :

whereDate / whereMonth / whereDay / whereYear

Метод служит для сравнения значения столбца с датой:

Метод служит для сравнения значения столбца с месяцем в году:

Метод служит для сравнения значения столбца с днём месяца:

Метод служит для сравнения значения столбца с указанным годом:

whereColumn

Для проверки на совпадение двух столбцов можно использовать метод :

В метод также можно передать оператор сравнения:


В метод также можно передать массив с несколькими условиями. Эти условия будут объединены оператором :

Группировка параметров

Иногда вам нужно сделать выборку по более сложным параметрам, таким как «where exists» или вложенная группировка условий. Конструктор запросов Laravel справится и с такими запросами. Для начала посмотрим на пример группировки условий в скобках:

Как видите, передав в метод , мы дали конструктору запросов команду, начать группировку условий. Замыкание получит экземпляр конструктора запросов, который вы можете использовать для задания условий, поместив их в скобки. Приведённый пример выполнит такой SQL-запрос:

Условия Where Exists

Метод позволяет написать SQL-условия . Метод принимает в качестве аргумента замыкание, которое получит экземпляр конструктора запросов, позволяя вам определить запрос для помещения в условие «exists»:

Этот пример выполнит такой SQL-запрос:

Laravel также поддерживает запросы для столбцов типа JSON в тех БД, которые поддерживают тип столбцов JSON. На данный момент это MySQL 5.7 и Postgres. Для запроса JSON столбца используйте оператор :

Retrieving Single Models / Aggregates

In addition to retrieving all of the records for a given table, you may also retrieve single records using , , or . Instead of returning a collection of models, these methods return a single model instance:

You may also call the method with an array of primary keys, which will return a collection of the matching records:

Sometimes you may wish to retrieve the first result of a query or perform some other action if no results are found. The method will return the first result that is found or, if no results are found, execute the given callback. The result of the callback will be considered the result of the method:

The method also accepts an array of columns to retrieve:

Not Found Exceptions

Sometimes you may wish to throw an exception if a model is not found. This is particularly useful in routes or controllers. The and methods will retrieve the first result of the query; however, if no result is found, a will be thrown:

If the exception is not caught, a HTTP response is automatically sent back to the user. It is not necessary to write explicit checks to return responses when using these methods:

You may also use the , , , and other provided by the query builder. These methods return the appropriate scalar value instead of a full model instance:

each()

is a simple method for iterating over the full collection. It accepts a callback with two arguments: item it is iterating through and the key. Key is 0 based index.

$collection->each(function ($item, $key) {
    info($item);
});

Above, it is simply logging the of each item.

When logging over eloquent collections, you can access all the column values as item properties. Here’s how we can iterate through all posts.

$posts = App\Post::all();

$posts->each(function ($item, $key) {
    // Do something
});

If you return false from your callback, it will stop iterating over items.

$collection->each(function ($item, $key) {
    // Tasks
    if ($key == 1) {
        return false;
    }
});

Optimizing Views

By default, views are compiled on demand. When a request is executed that renders a view, Laravel will determine if a compiled version of the view exists. If the file exists, Laravel will then determine if the uncompiled view has been modified more recently than the compiled view. If the compiled view either does not exist, or the uncompiled view has been modified, Laravel will recompile the view.

Compiling views during the request negatively impacts performance, so Laravel provides the Artisan command to precompile all of the views utilized by your application. For increased performance, you may wish to run this command as part of your deployment process:

You may use the command to clear the view cache:

Laravel Collection each()

The method iterate over the collection and pass the each item to a callback function with it’s which can be used as an index. For example if we want to interate through on our collection, we can do this way.

$products = Product::all();
$products->each(function ($item, $key) {
    return strtoupper($item);
});
dd($products);

// Result will be like below
Collection {#514 ▼
  #items: array:5 
    1 => array:3 
    2 => array:3 
    3 => array:3 
    4 => array:3 
  ]
}

If you would like to stop the iteration you can simply return like below:

$products = Product::all();
$products->each(function ($item, $key) {
    if (some condition here) {
        return false;
    }
});

Привязка модели роута

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

Неявная привязка

Laravel автоматически включает модели Eloquent, определённые в действиях роута или контроллера, чьи переменные имеют имена, совпадающие с сегментом роута. Например:

Так как переменная указывается в качестве аргумента Eloquent модели и название переменной совпадает с URI-сегментом , автоматически внедрит экземпляр модели, который имеет ID, совпадающий с соответствующим значением из URI запроса. Если совпадающий экземпляр модели не найден в базе данных, будет автоматически сгенерирован HTTP-отклик 404.

Изменение имени ключа

Если вы хотите, чтобы для получения класса данной модели вместо столбца использовался другой столбец базы данных, вы можете переопределить метод в своей модели Eloquent:

Явная привязка

Для регистрации явной привязки используйте метод роута для указания класса для данного параметра. Вам надо определить явные привязки вашей модели в методе класса :

Затем определите роут, содержащий параметр :

Из-за того, что мы ранее привязали все параметры к модели , её экземпляр будет внедрён в роут. Таким образом, к примеру, запрос внедрит объект , полученный из БД, который соответствует ID .

Если совпадающий экземпляр модели не найден в базе данных, будет автоматически сгенерирован HTTP-отклик 404.

Изменение логики принятия решения

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


С этим читают