2017-02-02 5 views
0

Интересно, можно ли иметь отношения между объектами и объектами ценностей или если третий объект является обязательным в качестве цели отношения. Целью может быть флаг различных типов объектов с общей структурой данных, которая имеет свою собственную бизнес-логику. Есть идеи ?Возможны ли ассоциации объектов ценностей?

Update:

Скажем, у меня есть бизнес-объект для моделирования Scap CPE namings:

<?php 

namespace Scap\Cpe\Naming; 

/** 
* Cpe22 represents the naming convention in CPE Naming version 2.2 
* Accepted values are only CPE URIs 
*/ 
class Cpe22 
{ 
    protected $cpe; 

    public function __construct($cpe) 
    { 
     if (! preg_match('/[c][pP][eE]:\/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6}/', $cpe)) { 
      throw new InvalidNamingException(); 
     } 
     $this->cpe = $cpe; 
    } 
} 

Если я хочу флаг различного рода объектов с этим VO в один-ко-многим способом , Я могу думать о 2 разных способах:

  • Объекты непосредственно связаны с VO, так что идентификаторы отношений могут быть ссылками на сущности и самими VO (= ключ, составленный из ссылочного идентификатора a d представительные VO поля)
  • Сущности, связанные с типами третьего лица, что встраивать СДН так, что идентификаторы отношений являются третьими лицами идентификаторов

Так интересно, если только вторым вариант доступен, или если первым может быть каким-то образом реализована.

+0

Возможно обновление вашего вопроса с реальным примером может помочь ? По определению объект значения не имеет уникального идентификатора, поэтому трудно понять, как он может участвовать в других отношениях. – Cerad

ответ

2

Вы должны использовать custom mapping type для таких вещей. Например, это может выглядеть примерно так:

use Doctrine\DBAL\Types\Type; 
use Doctrine\DBAL\Platforms\AbstractPlatform 

class Cpe22Type extends Type 
{ 
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) 
    { 
     return $platform->getVarcharTypeDeclarationSQL(array('length' => 250)); 
    } 

    public function convertToPHPVale($value, AbstractPlatform $platform) 
    { 
     return new Cpe22($value); 
    } 

    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
     return (string) $value; 
    } 

    public function getName() 
    { 
     return 'cpe22'; 
    } 

    public function requiresSQLCommentHint(AbstractPlatform $platform) 
    { 
     return true; 
    } 
} 

Очевидно, что вы должны добавить метод __toString() к вашему Cpe22 класса для этой работы.

После регистрации типа (как это сделать, зависит от структуры, в Symfony, например you do it in config.yml) можно просто сопоставить поле типа cpe22:

/** 
* @ORM\Column(name="my_cpe", type="cpe22") 
*/ 
public $myCpe; 
Смежные вопросы