0

Symfony2 で関連付けを適切に構成できません。1 対多の関係 (多くの世帯メンバーと 1 人のクライアント) の場合、現在のコードは以下に表示されます。
メンバーの foreach ループを省略すると、期待どおりにクライアントが追加されます。現在のエラーは次のとおりです。

「Mana\ClientBundle\Entity\Client#members」という関係を通じて、エンティティの永続操作をカスケードするように構成されていない新しいエンティティが見つかりました: Mana\ClientBundle\Entity\Member@00000000248e5b80000000004cc2e70f. この問題を解決するには: この不明なエンティティで EntityManager#persist() を明示的に呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。問題の原因となっているエンティティが見つからない場合は、'Mana\ClientBundle\Entity\Member#__toString()' を実装して手がかりを得ます。

クライアント エンティティのスニペット

namespace Mana\ClientBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Mana\ClientBundle\Entity\Client
 *
 * @ORM\Table(name="client")
 * @ORM\Entity
 */
class Client
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
    * @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")
    */
    protected $members;

    public function __construct()
    {
        $this->members = new ArrayCollection();
    }

    public function setMembers(ArrayCollection $members)
    {
        $this->members = $members;
        return $this;
    }

    public function addMember(Member $member)
    {
        $this->members->add($member);
        return $this;
    }

    public function removeMember(Member $member)
    {
        $this->members->removeElement($member);
        return $this;
    }

    public function getMembers()
    {
        return $this->members;
    }

世帯エンティティ

namespace Mana\ClientBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Mana\ClientBundle\Entity\Member
 *
 * @ORM\Table(name="household")
 * @ORM\Entity
 */
class Member
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

     /**
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="members")
     * @ORM\JoinColumn(name="clientId", referencedColumnName="id")
     *
     */
     protected $client;

//--- properties

    public function setClient(Client $client)
    {
        $this->client = $client;
        return $this;
    }

    public function getClient()
    {
        return $this->client;
    }

//  getters, setters

コントローラ createAction():

    public function createAction(Request $request)
    {
        $client  = new Client();
        $form = $this->createForm(new ClientType(), $client);
        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($client);
            $em->flush();
            foreach ($client->getMembers() as $member)
            {
                $em->persist($member);
            }
            $em->flush();
            return $this->redirect($this->generateUrl('client_show', array('id' => $entity->getId())));
        }
4

3 に答える 3

0

「$members」には何が含まれていますか?

発生するエラーは、基本的に「client_id」を持つオブジェクトをデータベースに格納しようとしているが、オブジェクトによって設定されていないことです。

$ membersに含まれているものにその列がある場合は、次のようなものを呼び出す必要がある可能性があります

$member->setClient($entity) 

それらをflush()しようとする前に。

また、ご存知のとおり、$ em-> flush()が実際に呼び出されるまで、そのエラーはスローされません。これは、データベースに何かを挿入しようとするのはそれだけだからです。$ membersがクライアントに追加されることはなく、永続化しようとしないため、forループなしで機能する可能性があります。

アップデート

クライアントIDを直接割り当てないでください。あなたの最初の関係はもっと正しかった。

// In HouseHold
/**
 *@ORM\ManyToOne(targetEntity="Client")
 *@ORM\JoinColumn(name="clientId", referencedColumnName="id")
 */
protected $client;

public function getClient() { return $this->client; }
public function setClient(Client $client) { $this->client = $client; }

setClientId()の代わりに$ member-> setClient($ client)を実行するよりも。

Doctrineに関する限り、clientId変数はDoctrineにとって何の意味もありません。クライアントでgetClientId()を探しています。

于 2012-12-08T21:41:10.340 に答える
0

認識すべき基本的な要素は、DoctrineはManyToOne関係の所有側に加えられた変更にのみ作用し、所有側は、ManyToOne句を含むエンティティであるということです。したがって、今回のケースでは、世帯はク​​ライアントではなく、永続化する必要がある所有側です。したがって、コントローラーの主な変更点は次のとおりです。

    $member->setClient($client);
    $em->persist($member);
于 2012-12-09T17:48:34.210 に答える
0

あなたが使用することができます

foreach ($client->getMembers() as $member)
        {
            $em->merge($member);
        }
于 2014-12-24T00:27:52.123 に答える