Php 原则2中的一对多关系ORM不插入远程密钥

Php 原则2中的一对多关系ORM不插入远程密钥,php,orm,doctrine,schema,relationship,Php,Orm,Doctrine,Schema,Relationship,大家好 我有一个问题,与一些学说2的关系,目前正在运行到地面我 我试图在我的分析性设计模型和我的分析性数据模型之间建立一个非常好和简单的一对多关系 下面是我的代码和我的问题 foreach($entries as $entry) { // Instance of AnalyticsCampaign model with data in it. $campaign = $this->_getCampaignByGoogleId($entry['campaignId']);

大家好

我有一个问题,与一些学说2的关系,目前正在运行到地面我

我试图在我的分析性设计模型和我的分析性数据模型之间建立一个非常好和简单的一对多关系

下面是我的代码和我的问题

foreach($entries as $entry)
{
    // Instance of AnalyticsCampaign model with data in it.
    $campaign = $this->_getCampaignByGoogleId($entry['campaignId']);            
    $daysAgo = time() - $campaign->getUpdated();
    $dateCreated = time() - $campaign->getCreated();
    if($daysAgo>=86400 || $dateCreated < 86400)
    {
        // More or equal to 1 day has passed since last database update
        // Let's insert these fuckers.
        // Insert the new GA data.

        $data = new Model_AnalyticsData();
        $data->fromArray($entry);
        $data->setCampaign($campaign->getId());
        $campaign->data = array($data);
        $this->em->persist($campaign);

    }
}
$this->em->flush();
以前有人见过吗,如果是的话,我到底做错了什么


非常感谢,我将给能帮助我的人一百万个互联网

问题是因为我需要将AnalyticsData插入AnalyticsCampaign,然后将AnalyticsCampaign插入AnalyticsData

我对教义的思考显然是完全错误的。我需要从物体的角度来考虑它。因此,当我试图插入活动ID时,它失败了,因为条令必须与对象而不是ID建立关系

所以我的代码最后是这样的:

$data = new Model_AnalyticsData();
$data->fromArray($entry);
$data->setCampaign($campaign);
$campaign->data = array($data);
$this->em->persist($campaign);
因此,由于$campaign->data是一个ArrayObject,它不会只接受该对象,因此您需要先将其放入数组中(显然,这意味着您可以根据需要插入任意多个子实体)

就这样

所有的功劳都归于贝伯雷关于自由节点IRC的理论

<?php

/**
 * AnalyticsData
 *
 * @Table(name="analyticsData")
 * @Entity
 */
class Model_AnalyticsData
{
    public function __construct()
    {
        // constructor is never called by Doctrine
        $this->created = $this->updated = time();
    }



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


    /**
     * @var integer $campaignrank
     *
     * @Column(name="campaignRank", type="integer", nullable=true)
     */
    private $campaignRank;

    /**
     * @var decimal $cost
     *
     * @Column(name="cost", type="decimal", nullable=true)
     */
    private $cost;

    /**
     * @var integer $impressions
     *
     * @Column(name="impressions", type="integer", nullable=true)
     */
    private $impressions;

    /**
     * @var integer $clicks
     *
     * @Column(name="clicks", type="integer", nullable=true)
     */
    private $clicks;

    /**
     * @var decimal $costperclick
     *
     * @Column(name="costPerClick", type="decimal", nullable=true)
     */
    private $costPerClick;

    /**
     * @var integer $averagecampaignposition
     *
     * @Column(name="averageCampaignPosition", type="integer", nullable=true)
     */
    private $averageCampaignPosition;

    /**
     * @Column(type="integer")
     */
    private $created;

    /**
     * @Column(type="integer")
     */
    private $updated;

    /**
     *
     * Store a reference to the campaign that this relates to
     * @ManyToOne(targetEntity="Model_AnalyticsCampaign", inversedBy="data")
     * @JoinColumn(name="campaignId", referencedColumnName="id")
     */
    protected $campaign;


    public function fromArray(array $array)
    {
        $objects = get_object_vars($this);
        foreach($array as $item => $value)
        {
            if(array_key_exists($item, $objects))
            {
                $this->$item = $value;
            }
        }
    }

    /**
     * @PreUpdate
     */
    public function updated()
    {
        $this->updated = time();

    }

    public function setCampaign($id)
    {
        $this->campaign = $id;
    }


}
Exception information:

Message: A new entity was found through a relationship that was not configured to cascade persist operations: @. Explicitly persist the new entity or configure cascading persist operations on the relationship.
Stack trace:

#0 /usr/share/php/Doctrine/ORM/UnitOfWork.php(490): Doctrine\ORM\UnitOfWork->computeAssociationChanges(Array, 1)
#1 /usr/share/php/Doctrine/ORM/UnitOfWork.php(505): Doctrine\ORM\UnitOfWork->computeChangeSet(Object(Doctrine\ORM\Mapping\ClassMetadata), Object(Model_AnalyticsData))
#2 /usr/share/php/Doctrine/ORM/UnitOfWork.php(249): Doctrine\ORM\UnitOfWork->computeChangeSets()
#3 /usr/share/php/Doctrine/ORM/EntityManager.php(328): Doctrine\ORM\UnitOfWork->commit()
#4 /home/tom/development/seo.qe.org/application/modules/default/controllers/AnalyticsController.php(64): Doctrine\ORM\EntityManager->flush()
#5 /usr/share/php/Zend/Controller/Action.php(513): AnalyticsController->indexAction()
#6 /usr/share/php/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#7 /usr/share/php/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#8 /usr/share/php/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#9 /usr/share/php/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#10 /home/tom/development/seo.qe.org/public/index.php(26): Zend_Application->run()
#11 {main}                

Request Parameters:

array (
  'controller' => 'analytics',
  'action' => 'index',
  'module' => 'default',
)                
$data = new Model_AnalyticsData();
$data->fromArray($entry);
$data->setCampaign($campaign);
$campaign->data = array($data);
$this->em->persist($campaign);