2015-02-23 70 views
0

我使用Zend框架2學說2.Doctrine2 - 單向多對一

在我正在開發的應用程序,我得到了不同的命名空間下2個實體:

  • 系統\用戶\實體\用戶
  • 應用\ APPS \時間表\實體\工作日誌

Application\Apps\Timesheet\Entity\Worklog,每個工作日誌都有一個用戶,因爲實體駐留在不同的名稱不同的模塊中速度,我想在Worklog實體中存儲一個單向用戶關係。

當前我正在使用以下結構來存儲Worklog和用戶之間的關係。

class Worklog 
{ 
    /** 
    * Worklog Identifier. 
    * 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @var integer 
    * @access protected 
    */ 
    protected $id; 

    /** 
    * User who logged the work 
    * 
    * @ORM\ManyToMany(targetEntity="Application\Apps\Timesheet\Entity\User",cascade={"persist", "remove"}) 
    * @ORM\JoinTable(name="timesheet_worklog_user", 
    *  joinColumns={@ORM\JoinColumn(name="worklog_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
    *) 
    * @var object 
    * @access protected 
    */ 
    protected $user; 
} 

雖然這項工作,發出帶有這種方法,它存儲在不同的表之間的關係,我想知道如果它是可以存儲用戶關係在同一worklog表列user_id,能有人在這裏給我一些指針?

這裏是我使用的代碼:

namespace System\User\Entity; 
/** 
* User class. 
* 
* @ORM\Entity 
* @ORM\Table(name="system_user") 
*/ 
class User 
{ 
    /** 
    * User Identifier 
    * 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @var integer 
    * @access protected 
    */ 
    protected $id; 

    /** 
    * Full name of the user. 
    * 
    * @ORM\Column(type="string", nullable=false, length=255) 
    * @var string 
    * @access protected 
    */ 
    protected $name; 

    /** 
    * User email. 
    * 
    * @ORM\Column(type="string", nullable=false, length=255) 
    * @var string 
    * @access protected 
    */ 
    protected $email; 
} 

namespace Application\Apps\Timesheet\Entity; 
/** 
* User Worklog. 
* 
* @ORM\Entity 
* @ORM\Table(name="timesheet_worklog") 
*/ 
class Worklog 
{ 
    /** 
    * Worklog Identifier. 
    * 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @var integer 
    * @access protected 
    */ 
    protected $id; 

    /** 
    * Start Time 
    * 
    * @ORM\Column(name="start_time", nullable=false, type="datetime") 
    * @var DateTime Object 
    * @access protected 
    */ 
    protected $startTime; 

    /** 
    * End time. 
    * 
    * @ORM\Column(name="end_time", nullable=false, type="datetime") 
    * @var DateTime Object 
    * @access protected 
    */ 
    protected $endTime; 

    /** 
    * User who logged the work 
    * 
    * @ORM\ManyToMany(targetEntity="Application\Apps\Timesheet\Entity\User",cascade={"persist", "remove"}) 
    * @ORM\JoinTable(name="timesheet_worklog_user", 
    *  joinColumns={@ORM\JoinColumn(name="worklog_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
    *) 
    * @var object 
    * @access protected 
    */ 
    protected $user; 
} 

謝謝。

+1

爲什麼使用ManyToMany關係而不是ManyToOne? ManyToMany是導致生成連接表的原因。 – Cerad 2015-02-23 17:13:15

+0

這確實很奇怪,但這是教條主義如何推薦的,查看這個鏈接http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many -un-directional-with-join-table – 2015-02-23 17:21:57

+0

@Cerad,你指出我正確的方向,它的工作原理,謝謝:) – 2015-02-23 17:45:26

回答

0

對於具有類似問題的人,我解決了這個改變

/** 
* User who logged the work 
* 
* @ORM\ManyToMany(targetEntity="Application\Apps\Timesheet\Entity\User",cascade={"persist", "remove"}) 
* @ORM\JoinTable(name="timesheet_worklog_user", 
*  joinColumns={@ORM\JoinColumn(name="worklog_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
*) 
* @var object 
* @access protected 
*/ 
protected $user; 

/** 
* User who logged the work 
* 
* @ORM\ManyToOne(targetEntity="System\User\Entity\User",cascade={"persist", "remove"}) 
* @var object 
* @access protected 
*/ 
protected $user; 

謝謝@Cerad爲指向正確的方向。