これは私が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;
パイスとCiudadanoテーブルが同じです。私はそれらの中で何も変えなかった(これは私が持っている問題と関係があるかどうかわからない)。
私が行ったテストは次のとおりです: テーブルを作成するように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
私は注釈との関係に問題があると信じています。私は多分それをやるべきようにやっていないと思う。何か提案はありますか?道に迷いました。
あなたは(nacionalidad)真ん中のテーブル内の余分なフィールドを持つ多くの関係に多くを作成しようとしていますか? – smoreno
こんにちは、私はフェチャはスペイン語で誕生日を意味すると思います(私はフランス語なので、わかりません)。はいの場合は、Ciudadanoエンティティに保存してください。これらの注釈を単純化することができます... – greg0ire
Fechaは日付を意味し、任意の日付(誕生日はfecha de nacimientoまたはcumpleaños)です。私はそれが私が欲しいものではないので、私はCiudadanoにそれを格納することはできません。しかし、助けてくれてありがとう。 –