使用连接表实体作为参考

时间:2015-05-04 07:58:04

标签: sql symfony orm doctrine-orm

我花了最后一天试图找到解决我遇到的问题的方法,现在转向你,看看你是否可以提供一些建议。

从表开始,然后是实体 我有三张桌子, 表-A 表-B table_c 每个表行都有一个唯一的id table_c包含对table_a_id和table_b_id的引用 这个引用应该是单向的,因为table_a和table_b不需要知道table_c的存在。 此外,没有级联,如果table_a或table_b中的id不存在,则table_c不能插入行。

好的,现在是实体。 (我将删除不相关的代码以保持简短)

实体A定义table_a

/**
* A
* @ORM\Entity(repositoryClass="Sample\Bundle\MyBundle\Entity\ARepository")
* @ORM\Table("table_a")
*/
class A
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 *
 */
private $id;

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


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

/**
 * Set name
 * @param string $name
 * @return A
 */
public function setName($name)
{
    $this->name = $name;
    return $this;
}

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

实体B定义table_b

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

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

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

/**
 * Set name
 * @param string $name
 * @return B
 */
public function setName($name)
{
    $this->name = $name;
    return $this;
}

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

实体C映射table_c并与table_a和table_b

具有多对一关系
 /**
 * C
 *
 * @ORM\Table("table_c")
 * @ORM\Entity(repositoryClass="Sample\Bundle\MyBundle\Entity\CRepository")
 */
 class PricesAverage
 {
/**
 * @var integer
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var \Sample\Bundle\MyBundle\Entity\A
 * @ORM\ManyToOne(targetEntity="Sample\Bundle\MyBundle\Entity\A", inversedBy="id")
 * @ORM\JoinColumn(name="a_id",unique=false)
 */
private $a;

/**
 * @var \Sample\Bundle\MyBundle\Entity\B
 * @ORM\ManyToOne(targetEntity="Sample\Bundle\MyBundle\Entity\B", inversedBy="id")
 * @ORM\JoinColumn(name="b_id",unique=false)
 */
private $b;

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

/**
 * @return A
 */
public function getA() {
    return $this->a;
}

/**
 * @param A $a
 * @return $this
 */
public function setA($a) {
    $this->a = $a;
    return $this;
}

/**
 * @return B
 */
public function getB() {
    return $this->b;
}

/**
 * @param B $b
 * @return $this
 */
public function setB($b) {
    $this->b = $b;
    return $this;
}
}

不,我做的是以下内容。 (这只是简化的逻辑,但它是相同的过程)

$days = 5;
$aCollection = {get collection of A's)

for($i = 0,$i<$days,$i++){
    foreach($aCollection as $a){
        $b = {get a single b}
        $c = new C();
        $c->setA($a)
          ->setB($b);
        {use doctrine to persist and flush $c}      
    }
}

正在发生的事情是,在第一次插入时,a的id是正确的,但在第二次插入时,doctrine似乎认为竞争者是一个新实体,并试图坚持并创建一个新的id。

我在不激活教条插入的情况下抛弃了我的集合,并且我看到A上的id是正确的,然后我在教义之后做同样的事情并发现该教条以某种方式清除了我的对象。

我该如何解决这个问题?

更新: 我解决了这个问题。

我遇到的问题是,在我完成批量插入后,相关实体已从实体管理器中删除。

这是每次冲洗后都清楚的结果。

我清楚地说到了这个过程的结束,所以我尽可能多地冲洗,但只清除一次。

0 个答案:

没有答案