Verification: a143cc29221c9be0

Orm php что это такое

Описание атрибутов

В следующем примере приведены примеры аннотаций для описания свойств сущностей БД.

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity(repositoryClass: PostRepository::class)]
class Post
{
    #[ORM\Column(type: Types::INTEGER)]
    #[ORM\Id, ORM\GeneratedValue(strategy: 'AUTO')]
    private ?int $id;

    #[ORM\Column(type: Types::BOOLEAN)]
    private bool $published = false;

    #[ORM\Column(type: Types::SIMPLE_ARRAY)]
    private array $text = [];

    #[ORM\ManyToOne(targetEntity: User::class)]
    public $author;

    #[ORM\ManyToMany(targetEntity: Tag::class)]
    #[ORM\JoinTable(name: "post_tags")]
    #[ORM\JoinColumn(name: "post_id", referencedColumnName: "id")]
    #[ORM\InverseJoinColumn(name: "tag_id", referencedColumnName: "id")]
    public Collection $tags;
}

Типизированные значения свойств по умолчанию

Начиная с PHP 7.4 типы свойств можно объявлять прямо в классах. Поэтому Doctrine теперь использует эти объявления типов, чтобы не дублировать тоже самое в аннотациях:

  • Столбцам не нужно определять тип
  • ManyToOne и OneToOne не нуждаются в указании сущностей для связей

Пример:

use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity(repositoryClass: UserRepository::class)]
class User
{
    #[ORM\Id, ORM\Column, ORM\GeneratedValue]
    public ?int $id = null;

    #[ORM\Column]
    public \DateTime $created;

    #[ORM\ManyToOne]
    public Email $email;
}

Query::HINT_READ_ONLY

Добавлена ​​возможность указывать сущности выбранные только для чтения для текущего сеанса. Это работает если они уже не были раньше загружены для записи:

$dql = 'SELECT u FROM ' . ReadOnlyEntity::class . ' u WHERE u.id = ?1';

$query = $entityManager->createQuery($dql);
$query->setParameter(1, $user->id);
$query->setHint(Query::HINT_READ_ONLY, true);

$user = $query->getSingleResult();

Index/UniqueConstraints с использованием имен полей

Вместо указания имен столбцов БД для объявления индексов или уникальности теперь можно альтернативно использовать имена полей сущности.

use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity]
#[ORM\Index(fields: ["isPublished"])]
class Post
{
    #[ORM\Column]
    public bool $isPublished = false;
}

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

INDEX BY по ассоциациям

Раньше INDEX BY был недоступен для ассоциаций, теперь вы можете это делать:

$dql = 'SELECT p, u FROM Post INDEX BY p.author JOIN p.author u WHERE p.id = 3';

Устаревшие

Doctrine ORM 2.9 переосмысливает устаревшие версии и интегрируется с нашей новой библиотекой doctrine/deprecations.

  • Не рекомендуется, merge() и detach() пока нет доступных замен
  • Уведомление о сохранении отслеживания изменений: вместо этого используйте явное отслеживание изменений
  • Использование SELECT PARTIAL, вместо SELECT NEW с Value Objects
  • EntityManager::flush() с аргументами
  • EntityManager::clear() с аргументами (используйте detach)
  • Именованные запросы в описание (используйте Repository)
  • cli-config.php для настройки консольных команд, используйте EntityManagerProvider вместо этого
  • Устарело doctrine/cache, вместо этого используйте PSR-6 стандарт

Устаревшие кешировение и PSR-6

В следующих версиях doctrine откажется от использования doctrine/cache и заменим его PSR-6. Если вы все еще используете doctrine/cache в приложениях, обязательно установите версию «^ 1.10» в composer.json. Подробности

Поддержка PHP 7.1

ORM 2.9 представляет поддержку PHP 7.1, потому что технически он все равно не поддерживался. Никаких изменений кода не потребовалось, чтобы разрешить это снова, за исключением набора тестов.

Поддержка PHP 7.1 была повторно добавлена, чтобы обеспечить очень широкий подход к подготовке некоторых устаревших версий, которые представлены в ORM 2 и будут удалены в версии 3.0.

Yii: Уроки прошлого и будущее

Александр Макаров поделился опытом разработки трёх версий фреймворка Yii. Какие практики оказались полезными, а какие больше вредными. Чему научились и какой в итоге путь выбрали для будущего Yii3.


Cycle ORM и графы

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