2017-08-31 39 views
0

我使用Pomm包爲我的symfony項目和我有一個問題 我創建了一個複雜的查詢和我的結果實例相同的對象具有不同的屬性。 這只是例如,但這個請求有關係 - >很多Pomm Bundle相同spl_object_hash但對象不同

我知道這個請求(1 - >很多)從關係的角度來看是不正確的,但我想了解pomm如何生成兩次相同的對象引用

public function getSousFamilleParametreListing(Where $condition = null,$locale='fr') 
{ 

$sql =" 
select 
    {projection} 
from 
    {sousfamilleparametre} sfp 
    inner join {parametre} par ON sfp.\"Parametre\" = par.\"ID\" 
    inner join {parametre_valeur} pav ON pav.\"Parametre\" = sfp.\"Parametre\" 
    inner join {valeur} val ON pav.\"Valeur\" = val.\"ID\" 

where {condition} 
    order by sfp.\"Niveau\", sfp.\"Pos\", pav.\"Pos\"" 
    ; 

$projection = $this->createProjection() 
        ->setField('nom_param','par."Nom"','text') 
        ->setField('type_param','par."Type"','text') 
        ->setField('pos_valeur', 'pav."Pos"','text') 
        ->setField('Valeur', 'val."ID"','text') 
        ->setField('nom_valeur','val."Nom"','text') 
        ->setField('couleur_valeur','val."ValCouleur"','text') 
        ->setField('sur_mesure','val."SurMesure"','boolean'); 


$parametre = $this->getSession() 
        ->getModel(ParametreModel::class); 

$valeur = $this->getSession() 
       ->getModel(ValeurModel::class); 

$parametre_valeur = $this->getSession() 
         ->getModel(ParametrevaleurModel::class); 

$condition = (new Where)->andWhere($condition); 


$sql = strtr(
    $sql, 
    [ 
     '{projection}'   => $projection->formatFieldsWithFieldAlias('sfp'), 
     '{sousfamilleparametre}'=> $this->structure->getRelation(), 
     '{parametre}'   => $parametre->getStructure()->getRelation(), 
     '{valeur}'    => $valeur->getStructure()->getRelation(), 
     '{parametre_valeur}' => $parametre_valeur->getStructure()->getRelation(), 
     '{locale}'    => $locale, 
     '{condition}'   => $condition, 
    ] 
); 

return $this->query($sql,$condition->getValues(),$projection); 
} 

而且的var_dump結果:

 


     object(AppBundle\Entity\Model\MyDb1\PublicSchema\Sousfamilleparametre)#574 (2) { 
     ["container":protected]=> 
     array(11) { 
     ["SousFamille"]=> 
     int(8) 
     ["Parametre"]=> 
     int(375) 
     ["Pos"]=> 
     int(0) 
     ["Niveau"]=> 
     int(1) 
     ["nom_param"]=> 
     string(6) "TAILLE" 
     ["type_param"]=> 
     string(1) "6" 
     ["pos_valeur"]=> 
     string(1) "0" 
     ["Valeur"]=> 
     string(1) "7" 
     ["nom_valeur"]=> 
     string(2) "T1" 
     ["couleur_valeur"]=> 
     string(7) "#4F4FFF" 
     ["sur_mesure"]=> 
     bool(false) 
     } 
     ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
     int(1) 
    } 
    string(32) "0000000067acae310000000004f8d20f" 
    object(AppBundle\Entity\Model\MyDb1\PublicSchema\Sousfamilleparametre)#574 (2) { 
     ["container":protected]=> 
     array(11) { 
     ["SousFamille"]=> 
     int(8) 
     ["Parametre"]=> 
     int(375) 
     ["Pos"]=> 
     int(0) 
     ["Niveau"]=> 
     int(1) 
     ["nom_param"]=> 
     string(6) "TAILLE" 
     ["type_param"]=> 
     string(1) "6" 
     ["pos_valeur"]=> 
     string(1) "1" 
     ["Valeur"]=> 
     string(1) "8" 
     ["nom_valeur"]=> 
     string(2) "T2" 
     ["couleur_valeur"]=> 
     string(7) "#2424FF" 
     ["sur_mesure"]=> 
     bool(false) 
     } 
     ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
     int(1) 
    } 
    string(32) "0000000067acae310000000004f8d20f" 

回答

0

只要中間件提供了數據庫行的面向對象表示,它必須解決的一個問題:做什麼,如果一個排被取出威斯甚至從兩個不同的疑問? Pomm使用identity mapper來跟蹤獲取的對象。

身份映射器使用實體的主鍵來識別行,每次從迭代器中獲取行時,如果它已經存在於實體映射器中,則實體會用新值進行充實並返回。這意味着提取的行被保存在內存中,如果讀取大量記錄,這可能是一個問題。

0

好的謝謝你的回答。

在我的SF項目中,我有一個現有的PostgreSQL數據庫(否​​則我會已經使用原則來管理我的數據庫)

的鹼沒有想到「對象」,也不是「網絡」,我有時不得不工作請求使我有這種對象碰撞的關注。

但是,通過創建「視圖」,我發現了一個竅門,它返回與我的映射實體完全相同的行,但是基於我的視圖創建了一個新的「ID」自動增量。

這不是最乾淨的方法,但在我的情況下,它完美的作品。

0

讓我們碰撞的一個示例:

相撞只有當我合併對象的兩個陣列在單個陣列中發生。 獨立$ listing_value和$ listing_value2即使它具有相同的對象,這不會產生衝突。

檢查例如:

$listing_valeur = $this->get('pomm') 
           ->getDefaultSession() 
           ->getModel(ParametrevaleurModel::class) 
           ->getParametreValeur(new Where("pav.\"Parametre\" in ($custom)",$tab_id), 
                "position(pav.\"Parametre\"::text in '".join(',',$tab_id)."')", 
                $request->getLocale()); 


    $listing_valeur2 = $this->get('pomm') 
           ->getDefaultSession() 
           ->getModel(ParametrevaleurModel::class) 
           ->getParametreValeur(new Where("pav.\"Parametre\" in ($custom)",$tab_id), 
                "position(pav.\"Parametre\"::text in '".join(',',$tab_id)."')", 
                $request->getLocale()); 
           $tab=array(); 

foreach ($listing_valeur as $key => $value) { 
//DUMP1 
    echo "<pre>"; 
     var_dump($value); 
    echo "</pre>"; 
    $tab[] = $value; 
} 

foreach ($listing_valeur2 as $key1 => $value1) { 
    $value1->set('Pos',10); 
    //DUMP2 
    echo "<pre>"; 
     var_dump($value1); 
    echo "</pre>"; 
    //$value & $value1 same spl_object_hash bug value different on POS 
    $tab[] = $value1; 
} 
echo "<hr>"; 
foreach ($tab as $key => $value) { 
    //WHEN ITERATE TAB COLLISION OBJET POS = 10 on VALUE & VALUE1 
    echo "<pre>"; 
     var_dump($value); 
    echo "</pre>"; 
} 

echo "dump1A<br/>"; 
foreach ($listing_valeur as $key => $value) { 
//DUMP1A 
    echo "<pre>"; 
     var_dump($value); 
    echo "</pre>"; 
    $tab[] = $value; 
} 

Dump1:

object(AppBundle\Entity\Model\MyDb1\PublicSchema\Parametrevaleur)#591 (2) { 
    ["container":protected]=> 
    array(6) { 
    ["Parametre"]=> 
    int(375) 
    ["Valeur"]=> 
    int(7) 
    ["Pos"]=> 
    int(0) 
    ["nom_valeur"]=> 
    string(2) "T1" 
    ["couleur_valeur"]=> 
    string(7) "#4F4FFF" 
    ["sur_mesure"]=> 
    bool(false) 
    } 
    ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
    int(1) 
} 

Dump2:

object(AppBundle\Entity\Model\MyDb1\PublicSchema\Parametrevaleur)#591 (2) { 
    ["container":protected]=> 
    array(6) { 
    ["Parametre"]=> 
    int(375) 
    ["Valeur"]=> 
    int(7) 
    ["Pos"]=> 
    int(10) 
    ["nom_valeur"]=> 
    string(2) "T1" 
    ["couleur_valeur"]=> 
    string(7) "#4F4FFF" 
    ["sur_mesure"]=> 
    bool(false) 
    } 
    ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
    int(3) 
} 

dump3(標籤迭代)

object(AppBundle\Entity\Model\MyDb1\PublicSchema\Parametrevaleur)#591 (2) { 
    ["container":protected]=> 
    array(6) { 
    ["Parametre"]=> 
    int(375) 
    ["Valeur"]=> 
    int(7) 
    ["Pos"]=> 
    int(10) 
    ["nom_valeur"]=> 
    string(2) "T1" 
    ["couleur_valeur"]=> 
    string(7) "#4F4FFF" 
    ["sur_mesure"]=> 
    bool(false) 
    } 
    ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
    int(3) 
} 
object(AppBundle\Entity\Model\MyDb1\PublicSchema\Parametrevaleur)#591 (2) { 
    ["container":protected]=> 
    array(6) { 
    ["Parametre"]=> 
    int(375) 
    ["Valeur"]=> 
    int(7) 
    ["Pos"]=> 
    int(10) 
    ["nom_valeur"]=> 
    string(2) "T1" 
    ["couleur_valeur"]=> 
    string(7) "#4F4FFF" 
    ["sur_mesure"]=> 
    bool(false) 
    } 
    ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
    int(3) 
} 

Dump1A:

object(AppBundle\Entity\Model\MyDb1\PublicSchema\Parametrevaleur)#591 (2) { 
    ["container":protected]=> 
    array(6) { 
    ["Parametre"]=> 
    int(375) 
    ["Valeur"]=> 
    int(7) 
    ["Pos"]=> 
    int(0) 
    ["nom_valeur"]=> 
    string(2) "T1" 
    ["couleur_valeur"]=> 
    string(7) "#4F4FFF" 
    ["sur_mesure"]=> 
    bool(false) 
    } 
    ["status":"PommProject\ModelManager\Model\FlexibleEntity\FlexibleContainer":private]=> 
    int(3) 
} 
相關問題