Учебники

Symfony — Учение ОРМ

В веб-фреймворке Symfony модель играет важную роль. Они являются субъектами предпринимательской деятельности. Они либо предоставляются клиентами, либо извлекаются из внутренней базы данных, обрабатываются в соответствии с бизнес-правилами и сохраняются обратно в базу данных. Это данные, представленные представлениями. Давайте узнаем о моделях и как они взаимодействуют с серверной системой в этой главе.

Модель базы данных

Нам необходимо сопоставить наши модели с внутренними элементами реляционной базы данных, чтобы безопасно и эффективно извлекать и сохранять модели. Это отображение может быть сделано с помощью инструмента Object Relational Mapping (ORM). Symfony предоставляет отдельный пакет DoctrineBundle , который интегрирует Symfony с сторонним инструментом ORM базы данных PHP, Doctrine .

Учение ОРМ

По умолчанию платформа Symfony не предоставляет никаких компонентов для работы с базами данных. Но он тесно интегрируется с доктриной ORM . Doctrine содержит несколько библиотек PHP, используемых для хранения базы данных и отображения объектов.

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

Пример доктрины ORM

В этом примере мы сначала настроим базу данных и создадим объект Student, а затем выполним в нем некоторые операции.

Для этого нам необходимо придерживаться следующих шагов.

Шаг 1. Создайте приложение Symfony

Создайте приложение Symfony, dbsample, используя следующую команду.

 Symfony новый образец

Шаг 2. Настройка базы данных

Обычно информация о базе данных настраивается в файле «app / config / parameters.yml».

Откройте файл и добавьте следующие изменения.

parameter.yml

parameters: 
   database_host: 127.0.0.1 
   database_port: null
   database_name: studentsdb 
   database_user: <user_name> 
   database_password: <password> 
   mailer_transport: smtp 
   mailer_host: 127.0.0.1 
   mailer_user: null 
   mailer_password: null 
   secret: 037ab82c601c10402408b2b190d5530d602b5809 
   
   doctrine: 
      dbal: 
      driver:   pdo_mysql 
      host:     '%database_host%' 
      dbname:   '%database_name%' 
      user:     '%database_user%' 
      password: '%database_password%' 
      charset: utf8mb4 

Теперь Doctrine ORM может подключаться к базе данных.

Шаг 3: Создать базу данных

Выполните следующую команду для создания базы данных «studentdb». Этот шаг используется для привязки базы данных в Doctrine ORM.

php bin/console doctrine:database:create

После выполнения команды она автоматически генерирует пустую базу данных «studentdb». Вы можете увидеть следующий ответ на вашем экране.

Created database `studentsdb` for connection named default

Шаг 4: Информация о карте

Информация о сопоставлении — это не что иное, как «метаданные». Это набор правил, которые информируют Doctrine ORM о том, как класс Student и его свойства отображаются в конкретную таблицу базы данных.

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

Student.php

Добавьте следующие изменения в файл.

<?php  
namespace AppBundle\Entity;  

use Doctrine\ORM\Mapping as ORM;  
/** 
   * @ORM\Entity 
   * @ORM\Table(name = "students") 
*/ 
class Student { 
   /** 
      * @ORM\Column(type = "integer") 
      * @ORM\Id 
      * @ORM\GeneratedValue(strategy = "AUTO") 
   */ 
   private $id;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name;  
   
   /** 
     * @ORM\Column(type = "text") 
     */ 
   private $address; 
}

Здесь имя таблицы необязательно. Если имя таблицы не указано, оно будет определено автоматически на основе имени класса сущности.

Шаг 5: Привязать сущность

Доктрина создает простые классы сущностей для вас. Это поможет вам построить любую сущность.

Выполните следующую команду для создания объекта.

php bin/console doctrine:generate:entities AppBundle/Entity/Student

Тогда вы увидите следующий результат, и сущность будет обновлена.

Generating entity "AppBundle\Entity\Student" 
   > backing up Student.php to Student.php~ 
   > generating AppBundle\Entity\Student

Student.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM;  
/** 
   * @ORM\Entity 
   * @ORM\Table(name="students") 
*/ 
class Student { 
   /** 
      * @ORM\Column(type="integer") 
      * @ORM\Id 
      * @ORM\GeneratedValue(strategy="AUTO") 
   */ 
   private $id;  
    
   /** 
      * @ORM\Column(type = "string", length = 50) 
   */ 
   private $name; 
    
   /** 
      * @ORM\Column(type = "text") 
   */
   private $address; 
    
   /** 
      * Get id 
      * 
      * @return integer 
   */ 
   public function getId() { 
      return $this->id; 
   }  
    
   /** 
      * Set name 
      * 
      * @param string $name 
      * 
      * @return Student 
   */ 
    
   public function setName($name) { 
      $this->name = $name;  
      return $this; 
   }  
    
   /** 
      * Get name 
      * 
      * @return string 
   */ 
    
   public function getName() { 
      return $this->name; 
   }  
    
   /**
      * Set address 
      * 
      * @param string $address 
      * 
      * @return Student 
   */ 
    
   public function setAddress($address) { 
      $this->address = $address;  
      return $this; 
   }  
    
   /** 
      * Get address 
      * 
      * @return string 
   */ 
   
   public function getAddress() { 
      return $this->address; 
   } 
}    

Шаг 6: Проверка карты

После создания сущностей вы должны проверить сопоставления с помощью следующей команды.

php bin/console doctrine:schema:validate

Это даст следующий результат —

[Mapping]  OK - The mapping files are correct. 
[Database] FAIL - The database schema is not in sync with the current mapping file

Поскольку мы не создали таблицу студентов, сущность не синхронизирована. Давайте создадим таблицу студентов с помощью команды Symfony на следующем шаге.

Шаг 7: Создать схему

Doctrine может автоматически создавать все таблицы базы данных, необходимые для сущности Student. Это можно сделать с помощью следующей команды.

php bin/console doctrine:schema:update --force 

После выполнения команды вы можете увидеть следующий ответ.

Updating database schema... 
Database schema updated successfully! "1" query was executed

Эта команда сравнивает, как должна выглядеть ваша база данных, с тем, как она на самом деле выглядит, и выполняет операторы SQL, необходимые для обновления схемы базы данных до того места, где она должна быть.

Теперь снова проверьте схему, используя следующую команду.

php bin/console doctrine:schema:validate 

Это даст следующий результат —

[Mapping]  OK - The mapping files are correct. 
[Database] OK - The database schema is in sync with the mapping files

Шаг 8: Получатель и установщик

Как видно из раздела «Привязать объект», следующая команда создает все методы получения и установки для класса Student.

$ php bin/console doctrine:generate:entities AppBundle/Entity/Student

Шаг 9. Сохранение объектов в базе данных.

Теперь мы сопоставили сущность Student с соответствующей таблицей Student. Теперь мы должны иметь возможность сохранять объекты Student в базе данных. Добавьте следующий метод к StudentController пакета.

StudentController.php

<?php  
namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response;  
use AppBundle\Entity\Student; 

class StudentController extends Controller { 
   /** 
      * @Route("/student/add") 
   */ 
   public function addAction() { 
      $stud = new Student(); 
      $stud->setName('Adam'); 
      $stud->setAddress('12 north street'); 
      $doct = $this->getDoctrine()->getManager();
      
      // tells Doctrine you want to save the Product 
      $doct->persist($stud);
      
      //executes the queries (i.e. the INSERT query) 
      $doct->flush(); 
      
      return new Response('Saved new student with id ' . $stud->getId()); 
   } 
} 

Здесь мы получили доступ к менеджеру доктрин с помощью метода getManager () через getDoctrine () базового контроллера, а затем сохранили текущий объект с помощью метода persist () менеджера доктрин. Метод persist () добавляет команду в очередь, но метод flush () выполняет реальную работу (сохраняя объект студента).

Шаг 10: выбор объектов из базы данных

Создайте функцию в StudentController, которая будет отображать сведения об ученике.

StudentController.php

/** 
   * @Route("/student/display") 
*/ 
public function displayAction() { 
   $stud = $this->getDoctrine() 
   ->getRepository('AppBundle:Student') 
   ->findAll();
   return $this->render('student/display.html.twig', array('data' => $stud)); 
}            

Шаг 11: создайте представление

Давайте создадим представление, которое указывает на действие отображения. Перейдите в каталог представлений и создайте файл «display.html.twig». Добавьте следующие изменения в файл.

display.html.twig

<style> 
   .table { border-collapse: collapse; } 
   .table th, td { 
      border-bottom: 1px solid #ddd; 
      width: 250px; 
      text-align: left; 
      align: left; 
   } 
</style> 

<h2>Students database application!</h2>  
<table class = "table">  
   <tr>  
      <th>Name</th>  
      <th>Address</th>  
   </tr>  
   {% for x in data %} 
   <tr>  
      <td>{{ x.Name }}</td>   
      <td>{{ x.Address }}</td>   
   </tr>  
   {% endfor %} 
</table> 

Вы можете получить результат, запросив URL «http: // localhost: 8000 / student / display» в браузере.

Он выдаст следующий вывод на экран —

Создать вид

Шаг 12: обнови объект

Чтобы обновить объект в StudentController, создайте действие и добавьте следующие изменения.

/** 
   * @Route("/student/update/{id}") 
*/ 
public function updateAction($id) { 
   $doct = $this->getDoctrine()->getManager(); 
   $stud = $doct->getRepository('AppBundle:Student')->find($id);  
   
   if (!$stud) { 
      throw $this->createNotFoundException( 
         'No student found for id '.$id 
      ); 
   } 
   $stud->setAddress('7 south street'); 
   $doct->flush(); 
   
   return new Response('Changes updated!'); 
}

Теперь запросите URL «http: // localhost: 8000 / Student / update / 1», и он даст следующий результат.

Он выдаст следующий вывод на экран —

Обновить объект

Шаг 13: Удалить объект

Удаление объекта аналогично и требует вызова метода remove () менеджера сущностей (доктрины).

Это можно сделать с помощью следующей команды.