2014-01-18 22 views
0

我有3個表爲:Symfony |原則幫助需要 - 插入多個表

  1. 產品 - PRODUCT_ID,PRODUCT_NAME,價格,類型,CREATE_TIME
  2. 網關 - gateway_id,gateway_name,CREATE_TIME
  3. mapping_product_gateways - mapping_id, gateway_id,product_id

產品和網關表沒有任何共同之處。沒有外鍵等。但是當我創建一個產品時,我將網關選擇字段顯示爲填充了來自網關表的數據的多選字段。一旦我點擊提交按鈕插入產品記錄,那時所有選定網關的ID將被插入到具有相同product_id和所選網關ID的mapping_product_gateways表中。

插入後,所以記錄可能像:

產品表記錄:

1,產品1,$ 10,數字,2013年10月10日

2,產品2, $ 13訂閱,2013年1月1日

網關表記錄:

1,貝寶,2014年3月1日

2,信用卡,2014年1月1日

3的2Checkout,2014年2月1日

所以,mapping_product_gateways記錄可能看起來像:

mapping_id,gateway_id,PRODUCT_ID

1,2,1

2,3,1

3,1,2

3,2,2

這意味着產品ID 1具有網關2 & 3與它和產品ID相關聯的2具有與它相關聯的網關1 & 2。

由於映射和產品表之間沒有直接關係,如何在庫類中構建查詢來執行搜索,插入,更新記錄?或者我是否需要創建onetomany類型的關係實體?

我完全困惑..對不起,但是對於symfony來說,這是非常新的東西。

謝謝

回答

1

這個問題不是symfony問題,它是一個學說問題。 首先你不應該問自己「數據庫將如何?」。更好的問題是:「產品和網關如何關聯?」

據我瞭解你的文章: - 許多產品可以有很多網關。

所以我們在談論一個多對多的關聯。這就是爲什麼你需要(「數據庫如何看起來像?」)的第三張表,它將兩個表關聯起來。 但我們需要回答第二個問題(「產品和網關如何關聯?」) 答案:它們通過多對多關聯關聯。

這是如何在教條中實現的?

/** 
* @ORM\Entity() 
*/ 
class Product{ 
    /* 
    * @ORM\ManyToMany(targetEntity="Gateway", inversedBy="products") 
    */ 
    private $gateways; 
    //adder + setter + getter 
} 

/** 
* @ORM\Entity() 
*/ 
class Gateway{ 
    /* 
    * @ORM\ManyToMany(targetEntity="Product", mappedBy="gateways") 
    */ 
    private $products; 
    //adder + setter + getter 
} 

要架構的更新做的PHP應用程序/控制檯學說:架構:更新--force在CMD(應用程序根目錄)

這是道路,理論解決問題。很好,不是嗎?

你的第二個問題是:我如何與實體CRUD?

讓我們說你的編碼在控制器。你的數據庫沒有產品,但5個網關(IDS 1-5)

class someController extends Controller { 
    public function doSomeCrud(){ 
     $em = $this -> get('doctrine.orm.entity_manager'); 
     $product = new Product(); 
     $someGateway = $em -> find('NAMESPACE\Gateway',3); 
     $anotherGateway = $em -> find('NAMESPACE\Gateway',5); 
     $product -> addGateway($someGateway) -> addGateway($anotherGateway); 
     $em -> persist($product); 
     $em -> flush(); 
    } 
} 

調用該方法後,您的數據庫將是這樣的:

產品:1

網關:1; 2; 3; 4; 5

Product_Gateway:(1,1,3-);(2,1,5)

可以經由

得到的產品的所有網關
$product -> getGateways(); 

和更新通過產品:

$product -> getGateways() -> first() -> setName('new name'); 
$em -> flush(); 

實體管理認識到網關3的名稱發生了變化,使一個UPDATE網關設置名稱= '新名' WHERE ID = 3

+0

感謝您的解釋。但仍然無法使其工作。代碼:https://dl.dropboxusercontent.com/u/19342096/MyApp.zip你可以看看嗎? – Deep

0

你是什​​麼人仍下落不明是getter和setter方法(例如產品 - >網關):

public function addGateway(GatewayInterface $gateway){ 
    $this -> gateways -> add($gateway); 
    return $this; 
} 

public function setGateways(Collection $gateway){ 
    $this -> gateways = $gateways; 
    return $this; 
} 

public function getGateways(){ 
    return $this -> gateways; 
} 

您需要首先創建GatewayInterface得到它的工作。 而你需要網關相同制定者/吸氣 - >產品

索引操作(創建產品)必須是這樣的:

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $product = new ShopProducts(); 
    $em -> persist($product); 
    $gateway = new GlobalGateways(); 
    $em -> persist($gateway); 
    $product -> addGateway($gateway); 
    $em -> flush(); 
} 

注意:你應該總是命名奇異的班。因此,如果名稱是「產品」和「GlobalGateway」,則會更好。