tangoman / relationship-bundle
Symfony 关联 Bundle
1.1.4
2021-02-26 19:44 UTC
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-09-27 04:12:20 UTC
README
TangoMan 关联 Bundle 为一对一、一对多、多对一、多对多关系提供魔术方法。
安装
步骤 1:下载 Bundle
打开命令行,进入您的项目目录,并执行以下命令以下载此 Bundle 的最新稳定版本
$ composer require tangoman/relationship-bundle
此命令需要您已全局安装 Composer,具体请参阅 Composer 文档中的安装章节。
步骤 2:启用 Bundle
然后,通过将其添加到项目 app/AppKernel.php 文件中注册的 Bundle 列表来启用该 Bundle。
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { // ... public function registerBundles() { $bundles = array( // ... new TangoMan\FrontBundle\TangoManRelationshipBundle(), ); // ... } }
步骤 3:更新您的实体
在您的实体中使用 TangoMan\RelationshipBundle\Traits\HasRelationships 特性,并使用适当的 Doctrine 注解定义属性。
步骤 4:更新您的数据库模式
打开命令行,进入您的项目目录,并执行以下命令以更新您的数据库模式
$ php bin/console schema:update
用法
实体
- 两个实体都必须使用
HasRelationships特性。 - 两个实体都必须使用适当的 Doctrine 注解定义属性。
cascade={"persist"}注解是 必需的(将允许实体之间的双向链接)。@method注解将允许在您的 IDE 中进行正确的自动完成(可选)。- 注意:
inversedBy总是在关系的拥有方(但我相信您已经知道了)。
一对一关系
cascade={"remove"}将避免在删除Owner时出现孤儿Item(可选)。
<?php // src\AppBundle\Entity\Owner.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use TangoMan\RelationshipBundle\Traits\HasRelationships; /** * Class Owner * @ORM\Table(name="owner") * @ORM\Entity(repositoryClass="AppBundle\Repository\OwnerRepository") * * @package AppBundle\Entity * * @method $this setItem(Item $item) * @method Item getItems() */ class Owner { use HasRelationships; // ... /** * @var Item * @ORM\OneToOne(targetEntity="AppBundle\Entity\Item", inversedBy="owner", cascade={"persist", "remove"}) */ private $item; // ...
<?php // src\AppBundle\Entity\Item.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use TangoMan\RelationshipBundle\Traits\HasRelationships; /** * Class Item * @ORM\Table(name="item") * @ORM\Entity(repositoryClass="AppBundle\Repository\ItemRepository") * * @package AppBundle\Entity * * @method $this setOwner(Owner $owner) * @method Owner getOwner() */ class Item { use HasRelationships; // ... /** * @var Owner * @ORM\OneToOne(targetEntity="AppBundle\Entity\Owner", mappedBy="item", cascade={"persist"}) */ private $owner; // ...
多对多关系
实体属性
- 属性 必须 拥有
@var ArrayCollection - 属性名称 必须 使用复数形式(因为它代表多个实体)
@ORM\OrderBy({"name"="ASC"})将允许在获取items时定义自定义排序(可选)。
<?php // src\AppBundle\Entity\Owner.php namespace AppBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use TangoMan\RelationshipBundle\Traits\HasRelationships; /** * Class Owner * @ORM\Table(name="owner") * @ORM\Entity(repositoryClass="AppBundle\Repository\OwnerRepository") * * @package AppBundle\Entity * * @method $this setItems(Item[] $items) * @method Item getItems() */ class Owner { use HasRelationships; // ... /** * @var ArrayCollection|Item[] * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Item", inversedBy="owners", cascade={"persist", "remove"}) * @ORM\OrderBy({"name"="ASC"}) */ private $items; // ...
<?php // src\AppBundle\Entity\Item.php namespace AppBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use TangoMan\RelationshipBundle\Traits\HasRelationships; /** * Class Item * @ORM\Table(name="item") * @ORM\Entity(repositoryClass="AppBundle\Repository\ItemRepository") * * @package AppBundle\Entity * * @method $this setOwners(Owner[] $owners) * @method Owner getOwners() */ class Item { use HasRelationships; // ... /** * @var ArrayCollection|Owner[] * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Owner", mappedBy="items", cascade={"persist"}) * @ORM\OrderBy({"name"="ASC"}) */ private $owners; // ...
实体构造函数
构造函数 必须 使用 ArrayCollection 初始化属性
<?php // src\AppBundle\Entity\Owner.php namespace AppBundle\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use TangoMan\RelationshipBundle\Traits\HasRelationships; // ... /** * Owner constructor. */ public function __construct() { // ... $this->Items = new ArrayCollection(); }
表单类型
来自关系的 反向 方面的您的表单类型元素 必须 拥有 'by_reference' => false, 属性,以强制使用适当的设置器和获取器(即 add 和 remove 方法)。
<?php // src\AppBundle\Form\ItemType.php // ... /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder // ... ->add( 'owner', EntityType::class, [ 'label' => 'Owner', 'placeholder' => 'Select owner', 'class' => 'AppBundle:Owner', 'by_reference' => false, 'multiple' => true, 'expanded' => false, 'required' => false, 'query_builder' => function (EntityRepository $em) { return $em->createQueryBuilder('o') ->orderBy('o.name'); }, ] ); }
注意
如果您发现任何错误,请在此处报告: 问题
许可
版权所有(c)2018 Matthias Morin
如果您喜欢 TangoMan 关联 Bundle,请星标!并关注我在 GitHub 上的动态:TangoMan75 ... 并查看我的其他酷项目。