2017-03-02 88 views
2

沒有仔細檢查我爲什麼要這樣做(這可能聽起來像一個壞的方法,但我有很好的理由)我想知道是否有一種方法在標準框架版3.1+創建一個關係聯繫到一個實體,可能不存在...Symfony&Doctrine:可選外鍵

首先我明白這確定了架構,這很好。因此,如果一個實體不存在,它不會創建一個外鍵,並且該字段始終爲空,或者如果目標實體確實存在,它將創建外鍵,並且該字段的工作方式與正常關聯類似...

其次,這隻會將項目更改爲項目,並且可能會更改爲更新,我認識到需要手動更新模式。

最好不用第三方軟件包的依賴......希望能爲標準框架,要做到這一點,

任何人? 在此先感謝

編輯

我使用註釋在我的實體學說ORM

此外

爲什麼我這樣做最簡單的版本是因爲某些軟件包是可選的項目到項目,並且捆綁包A可以僅在捆綁B存在時才使用捆綁B中的實體。我已經考慮過使用服務,如果容器 - >然後容器 - >獲取,或XML on-invalid =「null」的方法,但這並沒有解決屬性持久性問題。我很高興存儲一個非映射值作爲自定義關係字段,這很好,只是更長,並想知道是否有一種方法學說可以忽略缺少目標實體...

回答

1

我會保留另一個答案,因爲它回答'可空關聯目標'live data的問題。

這是一個'可爲空的關聯目標'meta data這是一個不同的事情的答案。

OP要求提供targetEntity在他的情況下不存在的元數據,例如,是不是在一個不同的捆綁(或任何OP的神祕原因可能是)。

在這種情況下,我建議建立在原則的TargetEntityListener它能夠在運行時解決targetEntity和targetEntity可以設置爲一個抽象類或接口:

/** 
* @ORM\ManyToOne(targetEntity="Acme\InvoiceBundle\Model\InvoiceSubjectInterface") 
* @var InvoiceSubjectInterface 
*/ 
protected $subject; 

InvoiceSubjectInterface隨後將在運行時被替換通過配置如提供的特定類:

# app/config/config.yml 
doctrine: 
    # ... 
    orm: 
     # ... 
     resolve_target_entities: 
      Acme\InvoiceBundle\Model\InvoiceSubjectInterface: AppBundle\Entity\Customer 

所以這應該是eiter一個可擴展的行爲提供no class或實現一個自己SOLU灰。

+0

這是一個偉大的建議謝謝,將探索並看看它是否適合我的需求......你是一位傳奇先生 – Prof83

3

嗯,也許我誤解了你的問題,但這聽起來像是一個正常的'可空'協會?

通過註釋創建ASSOCATION:

/** 
* 
* @var Child 
* @ORM\ManyToOne(targetEntity="Child") 
*/ 
private $child; 

,並使用

setChild(Child $child = null) 
{ 
    $this->child = $child; 
} 

作爲二傳手,讓空的值。

和你的getter可能看起來像:

getChild() 
{ 
    return $this->child; 
} 

如果沒有任何child它會返回null。

+0

不,不是想象中的那麼簡單,在targetEntity實體=可能會或可能不存在,如果沒有,一個例外是可以理解的提高,所以我想教義忽略的能力......? – Prof83

+0

所以你必須重新解釋你的問題,並且解釋你爲什麼要這麼做。對我來說,這根本沒有意義。爲什麼不創建實體,如果你不想使用它,簡單的不要使用它。 – LBA

+0

我的問題解釋說,這個實體可能不存在,它也說,有沒有必要審視我爲什麼這樣做,問題是,能不能做到......對不起,說白了,不過這一切都沒有 – Prof83