2012-02-01 6 views
18

は、私は多くの関係に多くのといくつかの問題を抱えています。私はUsersAssetsです。私は資産ページの資産にユーザーを割り当てることができます。残りのデータが永続化されている間、ユーザーのチェックボックスへの変更は保存されません。しかし、資産を編集/作成する際Symfony2のDoctrine2多くの多くのフォームへの保存ではないエンティティ

次のコードは、ユーザーのリストが表示されます。

私はmysqlクライアントを通じてusers_assetsにエントリを追加する場合、これらの変更は、資産のリストに示されています。

ユーザー

class User extends BaseUser 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Asset", inversedBy="users") 
    */ 
    private $assets; 
} 

資産

class Asset 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="assets") 
    */ 
    private $users; 
} 

AssetType

あなたが使用する必要が
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $form = $builder 
     ->add('users', null, array(
      'expanded' => true, 
      'multiple' => true 
     )) 
     ->getForm(); 

    return $form; 
} 
+0

あなたは 'null'なのでへの' chanageべきではありませんEntityType'?あなたはnullでどういう意味ですか? – Trix

答えて

29

を:

Asset: 
/** 
* @ORM\ManyToMany(targetEntity="Adaptive\UserBundle\Entity\User", inversedBy="assets") 
* @ORM\JoinTable(name="user_assets") 
*/ 
private $users; 

User: 
/** 
* @ORM\ManyToMany(targetEntity="Splash\SiteBundle\Entity\Asset", mappedBy="users") 
*/ 
private $assets; 

今私は、資産を保存するとき関連付けられたユーザーを保存します。エンティティまたはコレクションとしてbuilder-> addを定義する必要はありませんでした。私は単純にnullを渡し、実体情報を埋めるためにマッピング情報を使用しています。私は、ユーザー対資産にinversedByとJoinTable情報を持つことが必要な理由

AssetType: 
->add('users', null, array('expanded' => "true", "multiple" => "true")) 

正確にわからないが、それは動作しているようです今すぐ!

提案をありがとう!

+0

私は同様の問題を抱えていました。他の人への示唆:あなたの単数形/複数形がすべて自分のものであることを確認してください。どちらかのエンティティに多項式名(例えばCoolDude)がある場合、Doctrineのデフォルトはあなたのテーブル名はそれの小文字のバージョンであると仮定します。 'cooldude'。実際には 'cool_dude'だと明示的に設定しなければならないと思います。あなたはDoctrineのドキュメントでどのように見ることができます。 http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#many-to-many-bidirectional –

+0

問題は、同様のフォームを反対側:それは動作しません。 –

+0

ソリューションは私のために働いていない、私の結合テーブルは常に空です! – Fabien

0

'コレクション' FIEあなたのフォームにldのタイプ。

$builder->add('users', 'collection', array(
    'type' => new UserType(), 
    'prototype' => true, 
    'allow_add' => true, 
    'allow_delete' => true 
)); 

最初に明らかにUserType()フォームを作成する必要があります。ここで

は、コードサンプルを含め、必要なすべての情報、次のとおりです。まず

http://symfony.com/doc/current/cookbook/form/form_collections.html

http://symfony.com/doc/current/reference/forms/types/collection.html

+0

私はヌルを渡すことによって、これが私の教義のマッピングを通して型と推測すると考えました。私は資産のカテゴリを使用して同様のセットアップを持っており、それは素晴らしい作品です。これは、私がカテゴリコレクションを設定するコードです: - > add( 'categories'、null、array( 'expanded' = "true"、 "multiple" => "true"))... ...その資産にユーザーのための巧妙な機能を追加する必要があるだけでなく、現在のユーザーをその資産に割り当てることができればいいです –

+1

確かに、拡張からのdoctrineはメタデータに基づく推測を追加します。 ManyToManyアソシエーションを正しく定義した場合、型推測者はフィールドを 'collection'として設定します。 *正しく*、あなたのマッピングを逆転しなければならなかった理由は、アソシエーションの**所有者**があなたのケースの「資産」でなければならないということです。 – Florian

+0

'EntityType' +' Expanded' + 'Multiple'の問題は何ですか? – Trix

4

あなたは(予告hereを参照)の注釈にバックスラッシュの接頭辞をドロップする必要があります。

そして、あなたは、エンティティのフィールドタイプを使用する必要があります。私はこの作業を取得するために教義のマッピングを切り替えるために持っていたいくつかの理由について

$builder->add('users', 'entity', array(
    'class' => 'AdaptiveUserBundle:User', 
    'expanded' => true, 
    'multiple' => true, 
    'query_builder' => function(EntityRepository $er) { 
     return $er->createQueryBuilder('u') 
      ->orderBy('u.username', 'ASC'); 
    }, 
)); 
17

ない私はinversedByとユーザー対資産の JoinTable情報を持つことが必要な理由を正確に確認してください、それ は現在動作しているようです!

なぜあなたの変更が無視されたかという理由は、doctrineは関係の所有側(@Florianのように)の変更だけを維持するからです。十分な私は2016年に同じ問題に直面し、まだ解決策を見つけるのに苦労していた奇妙なhttp://docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html

9

この

は、この動作を説明する教義のドキュメントへのリンクです。

問題は、どのようなsymfonyの基本的フォームを保存しない場合には、このであるということです:私は、将来のGooglerのためにそれを共有することになります

$asset->getUsers()->add($user)

をそして、あなたは関係の逆側にしているので、それあなたの変更を維持しません。

何が本当に必要なのはそれを呼び出すようにすることです。この:

$asset->addUser($user)

アドユーザーは、()資産のエンティティで、次のように定義されて

public function addUser(User $user) 
{ 
    //add to the inverse side 
    $this->users->add($user); 

    //add on the owning side (only this is persisted) 
    $user->addAsset($this); //$user->assets->add($asset); 
} 

だから、symfonyがその方法を使用するには、$asset->addUser()メソッドを設定する必要があります。

フォームのためのあなたの usersフィールド上

'by_reference' => false

。ここhttp://symfony.com/doc/current/reference/forms/types/form.html#by-reference

この設定(それが所有している関係からエンティティを削除するように)あなたも同じようにremoveUser()方法を定義する必要が覚えている程度

詳細は

+0

これが受け入れられる回答である必要があります。私は不思議に思っていましたが、なぜ誰もこれを書いておらず、最終的にあなたのところに来た理由もありません。良いですね。 – DonCallisto

+0

**資産**はここに所有しているため、これは[Doctrine Documentation](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#)と競合します。所有と逆の関係 - 多くの団体との関係) – Trix

+0

@Trixありがとう、私はもう一度それをチェックして、実際にユーザー/資産の混乱がありました。私は編集ソリューションを作ったが、同じですが、私は変数名を一貫して調整しました。 –

関連する問題