0

これは単純な問題ですが、Stackoverflowやその他の場所で同様のスレッドをすべて実行しても成功しなかった後も、問題は残ります。

双方向の1対多の関係を機能させることができません。Biomass.fieldはアクセス可能(所有側)ですが、Field.biomasses(逆側)はアクセスできません。


テーブル(削除された消耗品フィールド)

CREATE TABLE `field` (
  `field_id` varchar(255) NOT NULL,
  PRIMARY KEY (`field_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `biomass` (
  `biomass_id` int(11) NOT NULL AUTO_INCREMENT,
  `field_id` varchar(255) NOT NULL,
  PRIMARY KEY (`biomass_id`),
  KEY `FK_field_has_0m_biomasses_idx` (`field_id`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;


ALTER TABLE `biomass`
  ADD CONSTRAINT `FK_field_has_0m_biomasses` FOREIGN KEY (`field_id`) REFERENCES 
`field` (`field_id`) ON DELETE CASCADE ON UPDATE CASCADE;

Field.php

<?php

namespace Acme\MainBundle\Entity;

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

/**
 * Acme\MainBundle\Entity\Field
 *
 * @ORM\Table(name="field")
 * @ORM\Entity
 */
class Field {

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

    /**
     * @var string $id
     *
     * @ORM\Column(name="field_id", type="string", length=255, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /*
     * var ArrayCollection $biomasses
     *
     * @ORM\OneToMany(targetEntity="Biomass", mappedBy="field", cascade={"all"})
     */
    private $biomasses;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Get biomasses
     *
     * @return ArrayCollection
     */
    public function getBiomasses() {
        return $this->biomasses;
    }

    /**
     * Set biomasses
     *
     * @param ArrayCollection $biomasses
     * @return ArrayCollection
     */
    public function setBiomasses(ArrayCollection $biomasses) {
        $this->biomasses = $biomasses;
        return $this->biomasses;
    }

    /**
     * Add Biomass
     *
     * @param Biomass $biomass
     * @return ArrayCollection
     */
    public function addBiomass(Biomass $biomass) {
        $biomass->setField($this);
        return $this->biomasses[] = $biomass;
    }

    /**
     * Set biomass
     *
     * @param Biomass $biomass
     * @return ArrayCollection
     */
    public function removeBiomass(Biomass $biomass) {
        return $this->biomasses->removeElement($biomass);
    }       

    function __toString() {
        return $this->getId();
    }
}

Biomass.php

<?php

namespace Acme\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Acme\MainBundle\Entity\Biomass
 *
 * @ORM\Table(name="biomass")
 * @ORM\Entity
 */
class Biomass {
    /**
     * @var integer $id
     *
     * @ORM\Column(name="biomass_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var Field
     *
     * @ManyToOne(targetEntity="Field", inversedBy="biomasses")
     * @JoinColumn(name="field_id", referencedColumnName="field_id")
     */
    private $field;

    /**
     * Get id
     *
     * @return string
     */
    public function getId() {
        return $this->id;
    }    

    /**
     * Set field
     *
     * @param Field $field
     * @return Biomass
     */
    public function setField(Field $field = null) {
        //$field->addBiomass($this);
        $this->field = $field;

        return $this;
    }

    /**
     * Get field
     *
     * @return Field
     */
    public function getField() {
        return $this->field;
    }

    function __toString() {
        return $this->id;
    }
}

FieldController.php

$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository("AcmeMainBundle:Field")->findAll();

foreach($entities as $field) {
    foreach($field->getBiomasses() as $biomass) {
        print_r($biomass->getId());
    }
}

これにより、:Warning:C:[...] \ MainBundle \ Controller \ FieldController.php行39のforeach()に無効な引数が指定されます。

Doctrineはコンストラクターを呼び出さないため、ArrayCollecionは作成されていません。これは、シリアル化/非シリアル化のトリックを使用してクラスをインスタンス化します。

これらのテーブルにダミーのデータがあり、データにアクセスできるので、教義はバイオマスオブジェクトをまったく作成していないようです。


環境Symfony-2.1.2、Apache / 2.4.3(Win64)、PHP / 5.4.6-Win64、MySQL Community Server 5.5.28

編集:列名のタイプミスを参照するBiomass.fieldを修正しました。

4

1 に答える 1

2

BioMass.php では、@JoinColumn は BioMass テーブルのidではなくfield_idを指す必要があります。

 /**
 * @var Field
 *
 * @ManyToOne(targetEntity="Field", inversedBy="biomasses")
 * @JoinColumn(name="field_id", referencedColumnName="field_id")
 */
于 2012-10-11T20:33:57.273 に答える