Zum Inhalt springen

Extbase und Joins

Erstellt am 17. Oktober 2013 · 1 Antwort · letzte Antwort am 17. Oktober 2013

Tags: Frage

coarsy ·

Hi und guten Morgen zusammen,

seit langem habe ich mal wieder ein Problem. Zwar möchte ich einen Query im Repository nicht mit statement verwenden, sondern natürlich Extbase Funktionalitäten verwenden.

Bislang habe ich das folgendermaßen gelöst:

$result = $query->statement('SELECT * FROM tx_cbdepartment_domain_model_areas a LEFT JOIN tx_cbdepartment_domain_model_departments b ON a.bd = b.bd WHERE a.zip =?', array($zip))->execute();

Leider finde ich nur wenig aussagekräftige Docus zu QOM. Augenblicklich versuche ich das hinzubiegen, wobei mir jetzt noch die WHERE Abfrage fehlt:

 $query = $this->createQuery();
    $qomFactory = Tx_Extbase_Dispatcher::getPersistenceManager()->getBackend()->getQomFactory();

    $selectorA = $qomFactory->selector(null, 'tx_cbdepartment_domain_model_areas');
    $selectorB = $qomFactory->selector(null, 'tx_cbdepartment_domain_model_departments');
    
    $joinCondition = $qomFactory->equiJoinCondition(
      $selectorA->getSelectorName(), 'bd',
      $selectorB->getSelectorName(), 'bd'
    );    
      
    $query->setSource(
      $qomFactory->join(
        $selectorA,
        $selectorB,
        Tx_Extbase_Persistence_QueryInterface::JCR_JOIN_TYPE_INNER,
        $joinCondition)
      );

Vielleicht habt Ihr ja eine Idee, wie man das schön und sauber umsetzen kann.

Besten Dank und allerbeste Grüße vom Chris

coarsy ·

Hi zusammen,

zwischenzeitlich bekomme ich ein Ergebnis mit folgendem Code:

	/**
	  * 
	  * @param string $zip
	  * @return Tx_CbDepartment_Domain_Model_Departments
	  */
	public function findBdZip($zip) {
					
    $query = $this->createQuery();
    //$result = $query->statement('SELECT * FROM tx_cbdepartment_domain_model_areas a LEFT JOIN tx_cbdepartment_domain_model_departments b ON a.bd = b.bd WHERE a.zip =?', array($zip))->execute();

    $qomFactory = Tx_Extbase_Dispatcher::getPersistenceManager()->getBackend()->getQomFactory();

    $selectorA = $qomFactory->selector(null, 'tx_cbdepartment_domain_model_areas');
    $selectorB = $qomFactory->selector(null, 'tx_cbdepartment_domain_model_departments');
    
    $joinCondition = $qomFactory->equiJoinCondition(
      $selectorA->getSelectorName(), 'bd',
      $selectorB->getSelectorName(), 'bd'
    );    
      
    $query->setSource(
      $qomFactory->join(
        $selectorA,
        $selectorB,
        Tx_Extbase_Persistence_QueryInterface::JCR_JOIN_TYPE_INNER,
        $joinCondition)
      );    
               
    $query->matching(
			$query->logicalAnd(
				$query->equals('zip', $zip)
			)
    );
                 
    return $query->execute();

	}

Allerdings werden jetzt nicht die Departments Objekte, sondern die Tx_Extbase_Persistence_QueryResult
Objekte zurückgegeben. Wie stellt man es dann an, dass hier die Departments zurückgeliefert werden?