2016-03-26 12 views
0

Bir istemcinin adres bilgilerini saklayan bir Symfony biriminde, tüm ülkeleri içeren bir varlıkla ManyToOne bağlantısı yaptım. Yani varlık de vardır aşağıdaki linki:Symfony formunun ManyToOne alanı vardır, ancak yine de __tostring() işlevini gerektirir

/** 
* @var string 
* 
* @ORM\Column(name="country_code", type="string", length=2) 
* 
* @ORM\ManyToOne(targetEntity="Country") 
* @ORM\JoinColumn(name="country_code", referencedColumnName="country_code") 
*/ 
private $countryCode; 

bu varlığın oluşturulan formda ben şöyle tanımlamış:

 ->add('countryCode', 'entity', array(
      'class' => 'MyBundle:Country', 
      'choice_label' => 'name_en', 
      'choice_value' => 'country_code', 
      'data' => 'nl', 
     )) 

Yani birincil anahtar ancak COUNTRY_CODE iki harfli saklamaz Hollanda için "nl" gibi kod.

O halde çalışmasını sağlamak için __tostring() kodunu eklemeliyim, ama neden bu? Ben zaten bir ManyToOne bağlantısı olduğu gibi __tostring işlevi gerekli olmayacaktı.

public function __toString() 
{ 
    return strval($this->countryCode); 
} 

cevap

0

sadece bu yazmak zorunda:

/** 
* @ORM\ManyToOne(targetEntity="PathTo/YourBundle/Entity/Country") 
*/ 
private $country; 

Sonra $ ülke (DB o en ID) Ülke Varlık bir referans olacak ve TÜM BT'S acces sağlayacak ALANLAR.

senin formda bu sözdizimi kullanımdan kaldırıldı gibi

->add('country', 'entity', array(.... 

kullanmaz, bunun yerine kullanmamalısınız sonra: muhtemelen kullanacağı alfabetik ederek ülkeyi sipariş etmek istediğimizden

use Symfony\Bridge\Doctrine\Form\Type\EntityType; //don't forget it on top of your form file 


->add('country', EntityType::class, array(.... 

Bunu yapmak için bir sorguyu ve nihayetinde kodunuz şöyle görünebilir:

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Doctrine\ORM\EntityRepository; 

... 

->add('country', EntityType::class, array(
     'class' => 'MyBundle:Country', 
     'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('c') 
         ->orderBy('c.name_en', 'ASC'); 
       }, 
     'choice_label' => 'name_en', 
     'data' => 'nl' 
    )) 

normalde Seçilen ülkenin benzersiz kimlik olacak olan choice_value konusunda endişelenmenize gerek yoktur: Müşteri Varlık acces edeceğiz zaman, sen yapacağız:

$client->getCountry()->getCountryCode() ; 

ülke kodu almak için.

+0

ManyToOne değiştirdim ve __tostring() işlevini kaldırdım ve şimdi ülke veritabanında bağlı. Ben sadece Symfony sürüm 2.7.10 içinde olduğum gibi query_buidler çalışıyorum bu kod yeni. Tüm ülkeleri almak ve varsayılanı ayarlamak için veritabanından nasıl bir sorgu yapabilirim? – Tom

+0

query_builder yeni bir özellik değil, 2.7'de çalışmalı. *. Kullanım ifadesini koydun mu? (Doctrine \ ORM \ EntityRepository;) kullanın? Ve eğer yaptıysanız, Ülke Varlığınız için bir deponuz var mı? – TomVerdier

+0

Evet Kullanım ekledim. Bu hata, orderBy seçeneğindedir, kaldırıldığında, varsayılan değer ayarlanmadığı sürece çalışır mı? OrderBy, name_en'nin bulunmadığı bir hatayı verir, ancak oradadır. – Tom

0

Veritabanının ilişkileri nasıl sakladığıyla ilgili bir şey kaçırdığınızı tahmin ediyorum.

ilk sorun: Bu gerekmez:

@ORM\Column(name="country_code", type="string", length=2) 

... @ORM\ManyToOne zaten bu özellik için şemayı açıklar çünkü.

Ve burada ikinci sorunkarşılamak: @ORM\ManyToOne uygun Ülke varlığın bir kimliği içeren bir tamsayı sütunu oluşturur. Bunun anlamı, bu özellik için bir form alanı oluşturduğunuzda, adres defteriniz (veya sizin adınız ne olursa olsun) öğenin ülke kodunu değil, yalnızca rakamları depoladığından, bir dize temsili olarak hangi özelliği göstermesi gerektiğini bilmez. senin varlık İlk

+0

Tamam, eğer doğru bir şekilde anlıyorsam, istediğim şey mümkün değil. Bir @ORM \ ManyToOne bağlantısı, bağlantı öğesi olarak varlığın yalnızca birincil kimliğini destekliyor mu? Gerçekten ilk problem çizgisi oradaydı, bu yüzden __tosting() değeri saklanabilir. – Tom

İlgili konular