php bin console make migration

Базы данных и Doctrine ORM¶

Вы предпочитаете видео-уроки? Посмотрите Doctrine screencast series.

Symfony предоставляет все инструменты, которые вам нужны для использования баз данных в вашем приложении благодаря Doctrine, лучшему набору PHP библиотек для работы с базами данных. Эти инструменты поддерживают реляционные базы данных такие как MySQL и PostgreSQL, а также NoSQL базы данных такие как MongoDB

Установка Doctrine¶

Конфигурация базы данных¶

Теперь, когда ваши параметры соединения настроены, Doctrine может создать для вас DB db_name :

Создание класса сущности (Entity)¶

Предположим, что вы создаёте приложение, в котором необходимо отображать товары. Даже не задумываясь о Doctrine или базах данных, вы уже знаете, что

New in version 1.3: Интерактивное поведение команды make:entity добавилось в MakerBundle 1.3.

Теперь у вас есть новый файл src/Entity/Product.php :

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Миграции: Создание таблиц / схемы базы данных¶

Если всё сработало, то вы должны увидеть что-то вроде:

Далее: Посмотрите на новую миграцию “migrations/Version20180207231217.php” Затем: Запустите миграцию с помощью php bin/console doctrine:migrations:migrate

Если вы откроете этот файл, то увидите, что он содержит SQL, необходимый для обновленя вашей DB! Чтобы запустить этот SQL, выполните ваши миграции:

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

Миграции и добавление дополнительных полей¶

Это также добавит новое свойство description и методы getDescription() и setDescription() :

В этот раз SQL в сгенерированном файле будет выглядеть так:

Система миграций умная. Она сравнивает все ваши сущности с текущим состоянием базы данных и генерирует SQL необходимый для их синхронизации! Как и раньше, примените ваши миграции:

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

Если вы предпочитаете добавлять новые свойства вручную, команда make:entity может генерировать методы геттеров и сеттеров для вас:

Сохранение объектов в базе данных¶

Пора сохранить объект Product в базу данных! Давайте создадим новый контроллер для экспериментов:

Рассмотрим предыдущий пример более детально:

И для создания, и для обновления объектов, рабочий процесс всегда одинаков: Doctrine достаточно умна для того, чтобы знать, что делать с вашей сущностью: INSERT или UPDATE.

Валидация объектов¶

Валидатор Symfony использует метаданные Doctrine для осуществления базовых заданий валидации:

Следующая таблица описывает связь между метаданными Doctrine и соответствующими ограничениями валидации, которые автоматически добавляются Symfony:

Аттрибут DoctrineОграничение валидацииЗаметки
nullable=false NotNullТребует установки компонента PropertyInfo
type TypeТребует установки компонента PropertyInfo
unique=true UniqueEntity
length Length

Так как компонент Form также как и API Platform внутри себя используют компонент Validator, все ваши формы и web API будут также автоматически получать пользу от этих автоматических ограничений валидации.

Извлечение объектов из базы данных¶

Также можно использовать ProductRepository с autowiring Symfony и внедрить его через dependency injection container:

Когда вы запрашиваете определённый тип объекта, вы всегда используете то, что известно, как его “repository”. Вы можете думать о repository, как о PHP-классе, единственной работой которого является помогать вам извлекать сущности определённого класса.

Когда у вас есть объект хранилища, у вас появляется множество helper-методов:

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

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Автоматическое извлечение объектов (ParamConverter)¶

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

Теперь, упростите ваш контроллер:

Существует еще множество опций, которые вы можете использовать. Прочтите больше о ParamConverter.

Обновление объекта¶

Когда вы получили объект из Doctrine, можно взаимодействовать с ним также как и с любым другим PHP-объектом:

Используя Doctrine для изменения объекта нужно сделать три шага:

Удаление объекта¶

Удаление объекта очень похоже, но требует вызова метода remove() в менеджере сущностей:

Запрашивание объектов: Repository¶

Вы уже видели, как объект repository позволяет вам выполнять базовые запросы без каких-либо усилий:

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

Строка передаваемая в createQuery() может показаться похожей на SQL, но это Doctrine Query Language. Это позволяет вам создавать запросы используя популярный язык запросов, но ссылаться вместо таблиц на PHP-объекты (например в выражении FROM ).

Теперь, вы можете вызать этот метод в repository:

Выполнение запросов с конструктором запросов Query Builder¶

Doctrine также предоставляет Query Builder, объектно-ориентированный способ писать запросы. Рекомендуется использовать его, когда запросы создаются динамически (то есть, базируясь на условной логике в PHP):

Запросы с помощью SQL¶

В дополнение, если необходимо, вы можете писать запросы напрямую с SQL:

С SQL, вы получите на выходе сырые данные, а не объекты (кроме случаев, когда вы используете функциональность NativeQuery).

Конфигурация¶

Отношения и ассоциации¶

Doctrine предоставляет все необходимые вам функции, чтобы управлять отношениями DB (также известными, как ассоциации), включая отношения ManyToOne, OneToMany, OneToOne и ManyToMany.

Тестирование DB¶

Расширения Doctrine (Timestampable, Translatable, etc.)¶

Сообщество Doctrine создало расширения для удовлетворения частых потребностей вроде “установить значение свойства createdAt автоматически при создании новой сущности”. Читайте делальнее о доступных расширениях Doctrine и используйте StofDoctrineExtensionsBundle для из интеграции в ваше приложение.

Узнать больше¶

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.

Источник

Базы данных и Doctrine ORM¶

Вы предпочитаете видео-уроки? Посмотрите Doctrine screencast series.

Symfony предоставляет все инструменты, которые вам нужны для использования баз данных в вашем приложении благодаря Doctrine, лучшему набору PHP библиотек для работы с базами данных. Эти инструменты поддерживают реляционные базы данных такие как MySQL и PostgreSQL, а также NoSQL базы данных такие как MongoDB

Установка Doctrine¶

Конфигурация базы данных¶

Теперь, когда ваши параметры соединения настроены, Doctrine может создать для вас DB db_name :

Создание класса сущности (Entity)¶

Предположим, что вы создаёте приложение, в котором необходимо отображать товары. Даже не задумываясь о Doctrine или базах данных, вы уже знаете, что

New in version 1.3: Интерактивное поведение команды make:entity добавилось в MakerBundle 1.3.

Теперь у вас есть новый файл src/Entity/Product.php :

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Миграции: Создание таблиц / схемы базы данных¶

Если всё сработало, то вы должны увидеть что-то вроде:

Далее: Посмотрите на новую миграцию “migrations/Version20180207231217.php” Затем: Запустите миграцию с помощью php bin/console doctrine:migrations:migrate

Если вы откроете этот файл, то увидите, что он содержит SQL, необходимый для обновленя вашей DB! Чтобы запустить этот SQL, выполните ваши миграции:

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

Миграции и добавление дополнительных полей¶

Это также добавит новое свойство description и методы getDescription() и setDescription() :

В этот раз SQL в сгенерированном файле будет выглядеть так:

Система миграций умная. Она сравнивает все ваши сущности с текущим состоянием базы данных и генерирует SQL необходимый для их синхронизации! Как и раньше, примените ваши миграции:

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

Если вы предпочитаете добавлять новые свойства вручную, команда make:entity может генерировать методы геттеров и сеттеров для вас:

Сохранение объектов в базе данных¶

Пора сохранить объект Product в базу данных! Давайте создадим новый контроллер для экспериментов:

Рассмотрим предыдущий пример более детально:

И для создания, и для обновления объектов, рабочий процесс всегда одинаков: Doctrine достаточно умна для того, чтобы знать, что делать с вашей сущностью: INSERT или UPDATE.

Валидация объектов¶

Валидатор Symfony использует метаданные Doctrine для осуществления базовых заданий валидации:

Следующая таблица описывает связь между метаданными Doctrine и соответствующими ограничениями валидации, которые автоматически добавляются Symfony:

Аттрибут DoctrineОграничение валидацииЗаметки
nullable=false NotNullТребует установки компонента PropertyInfo
type TypeТребует установки компонента PropertyInfo
unique=true UniqueEntity
length Length

Так как компонент Form также как и API Platform внутри себя используют компонент Validator, все ваши формы и web API будут также автоматически получать пользу от этих автоматических ограничений валидации.

Извлечение объектов из базы данных¶

Также можно использовать ProductRepository с autowiring Symfony и внедрить его через dependency injection container:

Когда вы запрашиваете определённый тип объекта, вы всегда используете то, что известно, как его “repository”. Вы можете думать о repository, как о PHP-классе, единственной работой которого является помогать вам извлекать сущности определённого класса.

Когда у вас есть объект хранилища, у вас появляется множество helper-методов:

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

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Автоматическое извлечение объектов (ParamConverter)¶

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

Теперь, упростите ваш контроллер:

Существует еще множество опций, которые вы можете использовать. Прочтите больше о ParamConverter.

Обновление объекта¶

Когда вы получили объект из Doctrine, можно взаимодействовать с ним также как и с любым другим PHP-объектом:

Используя Doctrine для изменения объекта нужно сделать три шага:

Удаление объекта¶

Удаление объекта очень похоже, но требует вызова метода remove() в менеджере сущностей:

Запрашивание объектов: Repository¶

Вы уже видели, как объект repository позволяет вам выполнять базовые запросы без каких-либо усилий:

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

Строка передаваемая в createQuery() может показаться похожей на SQL, но это Doctrine Query Language. Это позволяет вам создавать запросы используя популярный язык запросов, но ссылаться вместо таблиц на PHP-объекты (например в выражении FROM ).

Теперь, вы можете вызать этот метод в repository:

Выполнение запросов с конструктором запросов Query Builder¶

Doctrine также предоставляет Query Builder, объектно-ориентированный способ писать запросы. Рекомендуется использовать его, когда запросы создаются динамически (то есть, базируясь на условной логике в PHP):

Запросы с помощью SQL¶

В дополнение, если необходимо, вы можете писать запросы напрямую с SQL:

С SQL, вы получите на выходе сырые данные, а не объекты (кроме случаев, когда вы используете функциональность NativeQuery).

Конфигурация¶

Отношения и ассоциации¶

Doctrine предоставляет все необходимые вам функции, чтобы управлять отношениями DB (также известными, как ассоциации), включая отношения ManyToOne, OneToMany, OneToOne и ManyToMany.

Тестирование DB¶

Расширения Doctrine (Timestampable, Translatable, etc.)¶

Сообщество Doctrine создало расширения для удовлетворения частых потребностей вроде “установить значение свойства createdAt автоматически при создании новой сущности”. Читайте делальнее о доступных расширениях Doctrine и используйте StofDoctrineExtensionsBundle для из интеграции в ваше приложение.

Узнать больше¶

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.

Источник

Databases and the Doctrine ORM

Do you prefer video tutorials? Check out the Doctrine screencast series.

Symfony provides all the tools you need to use databases in your applications thanks to Doctrine, the best set of PHP libraries to work with databases. These tools support relational databases like MySQL and PostgreSQL and also NoSQL databases like MongoDB.

Databases are a broad topic, so the documentation is divided in three articles:

Installing Doctrine¶

Configuring the Database¶

Now that your connection parameters are setup, Doctrine can create the db_name database for you:

There are more options in config/packages/doctrine.yaml that you can configure, including your server_version (e.g. 5.7 if you’re using MySQL 5.7), which may affect how Doctrine functions.

There are many other Doctrine commands. Run php bin/console list doctrine to see a full list.

Creating an Entity Class¶

Suppose you’re building an application where products need to be displayed. Without even thinking about Doctrine or databases, you already know that you need a Product object to represent those products.

New in version 1.3: The interactive behavior of the make:entity command was introduced in MakerBundle 1.3.

Woh! You now have a new src/Entity/Product.php file:

If you are using an SQLite database, you’ll see the following error: PDOException: SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL. Add a nullable=true option to the description property to fix the problem.

This class is called an “entity”. And soon, you’ll be able to save and query Product objects to a product table in your database. Each property in the Product entity can be mapped to a column in that table. This is usually done with annotations: the @ORM\. comments that you see above each property:

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

The make:entity command is a tool to make life easier. But this is your code: add/remove fields, add/remove methods or update configuration.

Doctrine supports a wide variety of field types, each with their own options. To see a full list, check out Doctrine’s Mapping Types documentation. If you want to use XML instead of annotations, add type: xml and dir: ‘%kernel.project_dir%/config/doctrine’ to the entity mappings in your config/packages/doctrine.yaml file.

Be careful not to use reserved SQL keywords as your table or column names (e.g. GROUP or USER ). See Doctrine’s Reserved SQL keywords documentation for details on how to escape these. Or, change the table name with @ORM\Table(name=»groups») above the class or configure the column name with the name=»group_name» option.

Migrations: Creating the Database Tables/Schema¶

The Product class is fully-configured and ready to save to a product table. If you just defined this class, your database doesn’t actually have the product table yet. To add it, you can leverage the DoctrineMigrationsBundle, which is already installed:

If everything worked, you should see something like this:

Next: Review the new migration “migrations/Version20180207231217.php” Then: Run the migration with php bin/console doctrine:migrations:migrate

If you open this file, it contains the SQL needed to update your database! To run that SQL, execute your migrations:

This command executes all migration files that have not already been run against your database. You should run this command on production when you deploy to keep your production database up-to-date.

Migrations & Adding more Fields¶

This adds the new description property and getDescription() and setDescription() methods:

The new property is mapped, but it doesn’t exist yet in the product table. No problem! Generate a new migration:

This time, the SQL in the generated file will look like this:

The migration system is smart. It compares all of your entities with the current state of the database and generates the SQL needed to synchronize them! Like before, execute your migrations:

This will only execute the one new migration file, because DoctrineMigrationsBundle knows that the first migration was already executed earlier. Behind the scenes, it manages a migration_versions table to track this.

Each time you make a change to your schema, run these two commands to generate the migration and then execute it. Be sure to commit the migration files and execute them when you deploy.

If you prefer to add new properties manually, the make:entity command can generate the getter & setter methods for you:

Persisting Objects to the Database¶

It’s time to save a Product object to the database! Let’s create a new controller to experiment:

Inside the controller, you can create a new Product object, set data on it, and save it:

Congratulations! You just created your first row in the product table. To prove it, you can query the database directly:

Take a look at the previous example in more detail:

If the flush() call fails, a Doctrine\ORM\ORMException exception is thrown. See Transactions and Concurrency.

Whether you’re creating or updating objects, the workflow is always the same: Doctrine is smart enough to know if it should INSERT or UPDATE your entity.

Validating Objects¶

The Symfony validator reuses Doctrine metadata to perform some basic validation tasks:

The following table summarizes the mapping between Doctrine metadata and the corresponding validation constraints added automatically by Symfony:

Doctrine attributeValidation constraintNotes
nullable=false NotNullRequires installing the PropertyInfo component
type TypeRequires installing the PropertyInfo component
unique=true UniqueEntity
length Length

Because the Form component as well as API Platform internally use the Validator component, all your forms and web APIs will also automatically benefit from these automatic validation constraints.

This automatic validation is a nice feature to improve your productivity, but it doesn’t replace the validation configuration entirely. You still need to add some validation constraints to ensure that data provided by the user is correct.

Fetching Objects from the Database¶

Fetching an object back out of the database is even easier. Suppose you want to be able to go to /product/1 to see your new product:

Another possibility is to use the ProductRepository using Symfony’s autowiring and injected by the dependency injection container:

When you query for a particular type of object, you always use what’s known as its “repository”. You can think of a repository as a PHP class whose only job is to help you fetch entities of a certain class.

Once you have a repository object, you have many helper methods:

You can also add custom methods for more complex queries! More on that later in the Querying for Objects: The Repository section.

When rendering an HTML page, the web debug toolbar at the bottom of the page will display the number of queries and the time it took to execute them:

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Automatically Fetching Objects (ParamConverter)¶

In many cases, you can use the SensioFrameworkExtraBundle to do the query for you automatically! First, install the bundle in case you don’t have it:

Now, simplify your controller:

That’s it! The bundle uses the from the route to query for the Product by the id column. If it’s not found, a 404 page is generated.

There are many more options you can use. Read more about the ParamConverter.

Updating an Object¶

Once you’ve fetched an object from Doctrine, you interact with it the same as with any PHP model:

Using Doctrine to edit an existing product consists of three steps:

Deleting an Object¶

Deleting an object is very similar, but requires a call to the remove() method of the entity manager:

As you might expect, the remove() method notifies Doctrine that you’d like to remove the given object from the database. The DELETE query isn’t actually executed until the flush() method is called.

Querying for Objects: The Repository¶

You’ve already seen how the repository object allows you to run basic queries without any work:

Suppose you want to query for all Product objects greater than a certain price. Add a new method for this to your repository:

The string passed to createQuery() might look like SQL, but it is Doctrine Query Language. This allows you to type queries using commonly known query language, but referencing PHP objects instead (i.e. in the FROM statement).

Now, you can call this method on the repository:

See Injecting Services/Config into a Service for how to inject the repository into any service.

Querying with the Query Builder¶

Doctrine also provides a Query Builder, an object-oriented way to write queries. It is recommended to use this when queries are built dynamically (i.e. based on PHP conditions):

Querying with SQL¶

In addition, you can query directly with SQL if you need to:

With SQL, you will get back raw data, not objects (unless you use the NativeQuery functionality).

Configuration¶

Relationships and Associations¶

Doctrine provides all the functionality you need to manage database relationships (also known as associations), including ManyToOne, OneToMany, OneToOne and ManyToMany relationships.

Database Testing¶

Doctrine Extensions (Timestampable, Translatable, etc.)¶

Doctrine community has created some extensions to implement common needs such as “set the value of the createdAt property automatically when creating an entity”. Read more about the available Doctrine extensions and use the StofDoctrineExtensionsBundle to integrate them in your application.

Learn more¶

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.

Latest from the Symfony Blog

They Help Us Make Symfony

php bin console make migration. Смотреть фото php bin console make migration. Смотреть картинку php bin console make migration. Картинка про php bin console make migration. Фото php bin console make migration

Get Involved in the Community

A passionate group of over 600,000 developers from more than 120 countries, all committed to helping PHP surpass the impossible.

Symfony™ is a trademark of Symfony SAS. All rights reserved.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *