-2

当我插入新条目时,如果我设置 ManyToOne 关系“Category”,我将无法填写“categoryId”字段,为什么?

这是具有关系的实体:

<?php

namespace Application\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Item
 *
 * @ORM\Table(name="item")
 * @ORM\Entity
 */
class Item extends Base
{
    /**
     * @ORM\ManyToOne(targetEntity="Category")
     */
    private $category;


    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    public $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=40, nullable=false)
     */
    public $name;

    /**
     * @var integer
     *
     * @ORM\Column(name="category_id", type="integer", nullable=true)
     */
    public $categoryId;

}

这是我为生成 getter 和 setter 而创建的基类,并允许 $entry->name = 'yo' 而不是 $entry->setName('yo');

<?php

namespace Application\Entity;

class Base
{
    public function __call($method, $args) {
        if (preg_match('#^get#i', $method)) {
            $property = str_replace('get', '', $method);
            $property = strtolower($property);
            return $this->$property;
        }

        if (preg_match('#^set#i', $method)) {
            $property = str_replace('set', '', $method);
            $property = strtolower($property);
            $this->$property = $args[0];
        }
    }

    public function fromArray(array $array = array()) {
        foreach ($array as $key => $value) {
            $this->$key = $value; 
        }
    }
}

这就是我保存新项目的方式:

$item = new \Application\Entity\Item();
$item->name = 'Computer';
$item->categoryId = '12';
$this->em->persist($item);
$this->em->flush();

怎么了 ?

4

1 回答 1

1

你这样做是不对的!使用 Doctrine,您不使用 category_id 列(和类似的),而是使用关系。Doctrine 会处理列。

您必须阅读文档,但正确的方法是:

$category = new Category() ;
$category->setName("Food") ;

$item = new Item() ;
$item->setName("Pizza") ;
$item->setCategory($category) ;

$em->persist($item) ;
$em->flush() ;

这是 100% 正确的做事方式,你甚至不需要坚持新创建的 Category(Doctrine 会为你做这件事)。但是手动尝试设置 category_id 列是完全错误的做事方式。

还有一点:不要尝试制作 Doctrine2 的 ActiveRecord。当我从 D1 切换到 D2 时,我正在考虑做同样的事情,但最后认为这是浪费时间。看起来您正在尝试制作自己的框架;不要那样做。改为学习 Symfony2;这并不容易,但值得花时间。

于 2013-05-06T14:53:17.453 回答