2012-01-31 21 views
2

これは私がSymfonyでDoctrine2を使用して達成したいものです。Doctrine2 1対多のリレーションシップが機能していません。 Symfony2

http://www.freeimagehosting.net/97g8zこのリンクには、ERモデルのイメージがあります。

ので、これらは私のクラスである:

class Pais 
{ 
/** 
* @var integer $id 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string $nombre 
* 
* @ORM\Column(name="nombre", type="string", length=255) 
*/ 
private $nombre; 
... 

これはクラスCiudadanoです:

class Ciudadano 
{ 
/** 
* @var integer $id 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string $nombre 
* 
* @ORM\Column(name="nombre", type="string", length=255) 
*/ 
private $nombre; 

これは真ん中にあるクラスNacionalidad、次のとおりです。

class Nacionalidad 
{ 

/** 
* @var integer $idpais 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Pais") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
* 
*/ 
private $idpais; 

/** 
* @var integer $idciudadano 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ciudadano") 
* @ORM\JoinColumn(name="id", referencedColumnName="id") 
* 
*/ 
private $idciudadano; 

/** 
* @var date $fecha 
* 
* @ORM\Column(name="fecha", type="date") 
*/ 
private $fecha; 
... 

このコマンドの後:

CREATE TABLE Ciudadano (id INT AUTO_INCREMENT NOT NULL, nombre VARCHAR(255) NOT 
NULL, apellido VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 

CREATE TABLE Nacionalidad (id INT NOT NULL, fecha DATE NOT NULL, descripcion VAR 
CHAR(255) NOT NULL, INDEX IDX_8B2C843BBF396750 (id), PRIMARY KEY(id)) ENGINE = I 
nnoDB; 

CREATE TABLE Pais (id INT AUTO_INCREMENT NOT NULL, nombre VARCHAR(255) NOT NULL, 
PRIMARY KEY(id)) ENGINE = InnoDB; 

ALTER TABLE Nacionalidad ADD CONSTRAINT FK_8B2C843BBF396750 FOREIGN KEY (id) REF 
ERENCES Ciudadano(id); 

は、だから私はこれらの疑問を持っている:

php app/console doctrine:schema:create 

DoctrineはこのSQLを生成

  • Doctrine2はテーブルパイスを参照する外部キーを作成しないのはなぜ?
  • なぜ、Doctrine2はalter tableを作成しないため、テーブルnacionalidad 'idpais'と 'idciudadano'の属性がそのテーブルの主キーであることを示していますか?
  • 外部キーであるフィールドの型をDoctrineに伝えなければなりませんか? (Doctrine2は型を推測しますか?)
  • 私の表には、1対多の関係があります。なぜ私は多対1が必要でしょうか?私は理解したい。

私はこれで助けが必要です。多分:

  • 私は私のクラスに右の注釈を書いていないよ、または
  • 私はコンセプトが届きません。

だから、私がしようとして保持し、私はこの注釈を使用して、私が欲しかったものを達成できることが分かっ:

class Nacionalidad 
{ 

/** 
* @var integer $idpais 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Pais", inversedBy="Nacionalidad") 
* @ORM\JoinColumn(name="idpais", referencedColumnName="id") 
* 
*/ 
private $idpais; 

/** 
* @var integer $idciudadano 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ciudadano", inversedBy="Nacionalidad") 
* @ORM\JoinColumn(name="idciudadano", referencedColumnName="id") 
* 
*/ 
private $idciudadano; 

/** 
* @var date $fecha 
* 
* @ORM\Column(name="fecha", type="date") 
*/ 
private $fecha; 

パイスとCi​​udadanoテーブルが同じです。私はそれらの中で何も変えなかった(これは私が持っている問題と関係があるかどうかわからない)。

私が行ったテストは次のとおりです: テーブルを作成するようにdoctrineに指示した後、私はphpmyadminに行き、テーブルと関係が私が望むものであることを確認しました。はい、そうでした。しかし:

私はNacionalidadに行を挿入しようとしている:

$nacionalidad->setidpais('1'); 
$nacionalidad->setidciudadano('1'); 
$nacionalidad->setfecha('1989-02-01'); 
$nacionalidad->setdescripcion('Hola'); 

私はIDが1のテーブルPaisの行が存在すると確信している、と私はidを持つテーブルciudadanoで必ず行です1が存在する。

私はこのエラーを取得しています:

Warning: spl_object_hash() expects parameter 1 to be object, string given in C:\wamp\www\sym\vendor\doctrine\lib\Doctrine\ORM\UnitOfWork.php line 1218

私は注釈との関係に問題があると信じています。私は多分それをやるべきようにやっていないと思う。何か提案はありますか?道に迷いました。

+0

あなたは(nacionalidad)真ん中のテーブル内の余分なフィールドを持つ多くの関係に多くを作成しようとしていますか? – smoreno

+1

こんにちは、私はフェチャはスペイン語で誕生日を意味すると思います(私はフランス語なので、わかりません)。はいの場合は、Ciudadanoエンティティに保存してください。これらの注釈を単純化することができます... – greg0ire

+0

Fechaは日付を意味し、任意の日付(誕生日はfecha de nacimientoまたはcumpleaños)です。私はそれが私が欲しいものではないので、私はCiudadanoにそれを格納することはできません。しかし、助けてくれてありがとう。 –

答えて

2

私はあなたが問題が他の場所にあると信じています。このように2つのエンティティをバインドする場合は、すべてのロジックをオブジェクトに割り当てる必要があります。それはSymfonyが処理します。あなたがすべき言われていること

$pais = ... // either create new Pais object or retrieve it from db 
$ciudadano = ... // same as above 
$date = DateTime::createFromFormat('Y-m-d', '1989-02-0'); // no Date class in PHP, but I think this will work... 

$nacionalidad->setidpais($paid); 
$nacionalidad->setidciudadano($ciudadano); 
$nacionalidad->setfecha($date); 
$nacionalidad->setdescripcion('Hola'); // this is *simple* type so this can go like this 

私はだろうが、決してが必要であり、これらの属性とゲッター/セッターの名前を変更し、あなたが今しているとして、それから「ID」を削除し、技術的に言えば、管理オブジェクト、idsではない。このことができます

希望...

+0

ありがとうございました。私はそれを解決し、それはあなたが言ったことでした、そして、私はそれらを理解していなかったので教義の関係をどのように扱うのか分かりませんでした、そして私は間違いを犯していましたが、少し読んだ。 :) –

+0

ああ愚かな私、私はあなたの質問の日付を見ていない。私はあなたの問題を解決したと思います。あなたが幸いです:) –

+0

私はあなたの答えは他の人に役立つと確信しています;)。だから遅すぎることはありません。 –

関連する問題