tangoman/relationship-bundle

Symfony 关联 Bundle

安装: 73

依赖项: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 1

开放问题: 0

类型:symfony-bundle

1.1.4 2021-02-26 19:44 UTC

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, 属性,以强制使用适当的设置器和获取器(即 addremove 方法)。

<?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

License 在 MIT 许可证下分发。

如果您喜欢 TangoMan 关联 Bundle,请星标!并关注我在 GitHub 上的动态:TangoMan75 ... 并查看我的其他酷项目。

Matthias Morin | LinkedIn