Autor Wątek: doctrine2 domyslna wartość przy użyciu left join  (Przeczytany 9704 razy)

nouc

  • Newbie
  • *
  • Wiadomości: 1
    • Zobacz profil
doctrine2 domyslna wartość przy użyciu left join
« dnia: Maja 13, 2013, 16:42:34 »
Witam.
Posiadam dwie klasy entities
ProductLang:
<?php

namespace Entities\Shop;

/** @Entity @Table(name="shop_products_language",indexes={@index(name="link_rewrite_idx", columns={"link_rewrite"})}) */
class ProductLang extends \Entities\Common\Entity
{
/**
 * @Id @Column(type="integer")
 * @GeneratedValue(strategy="AUTO")
 */
protected $id;
/** @return int */
public function getId() {return $this->id;}
/** @param int $value */
public function setId($value) {$this->id $value;}

/**
 * @ManyToOne(targetEntity="Product", inversedBy="languageVersions")
 * @JoinColumn(name="product_id", referencedColumnName="id", onDelete="CASCADE")
 */
protected $product;
/**
 * @return Product
 **/
public function getProduct() {return $this->product;}
/** @param Product $value */
public function setProduct(Product $value) {
if ($value !== $this->product) {
$this->product $value;
$value->addProductLang($this);
}
}

/**
 * @ManyToOne(targetEntity="Entities\Common\Language")
 */
protected $language;
/**
 * @return \Entities\Common\Language
 * */
public function getLanguage() {return $this->language;}
/** @param \Entities\Common\Language $value */
public function setLanguage(\Entities\Common\Language $value) {$this->language $value;}

/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $name;
/** @return string */
public function getName() {return $this->name;}
/** @param string $value */
public function setName($value) {$this->name $this->replaceSpecialCharacter($value);}

/**
 * @Column(type="text")
 * @var string
 */
protected $description;
/** @return string */
public function getDescription() {return $this->description;}
/** @param string $value */
public function setDescription($value) {$this->description $value;}

/**
 * @Column(type="boolean")
 * @var boolean
 */
protected $active true;
/**
 * @return boolean
 * @param boolean $value
 */
public function isActive($val=null){if(is_null($val))return $this->active;$this->active=(bool)$val;}
/** @return boolean */
public function getActive() {return $this->active;}
/** @param boolean $value */
public function setActive($value) {$this->active $value;}

/**
 * @Column(type="boolean")
 * @var boolean
 */
protected $display true;
/**
 * @return boolean
 * @param boolean $value
 */
public function isDisplayed($val=null){if(is_null($val))return $this->display;$this->display=(bool)$val;}
/** @return boolean */
public function getDisplay() {return $this->display;}
/** @param boolean $value */
public function setDisplay($value) {$this->display $value;}


/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $meta_title;
/** @return string */
public function getMetaTitle() {return $this->meta_title;}
/** @param string $value */
public function setMetaTitle($value) {$this->meta_title $this->replaceSpecialCharacter($value);}


/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $meta_description;
/** @return string */
public function getMetaDescription() {return $this->meta_description;}
/** @param string $value */
public function setMetaDescription($value) {$this->meta_description $this->replaceSpecialCharacter($value);}


/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $meta_keywords;
/** @return string */
public function getMetaKeywords() {return $this->meta_keywords;}
/** @param string $value */
public function setMetaKeywords($value) {$this->meta_keywords $this->replaceSpecialCharacter($value);}


/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $link_title "";
/** @return string */
public function getLinkTitle() {return $this->link_title;}
/** @param string $value */
public function setLinkTitle($value) {$this->link_title $this->replaceSpecialCharacter($value);}


/**
 * @Column(type="string", length=255)
 * @var string
 */
protected $link_rewrite;
/** @return string */
public function getLinkRewrite() {return $this->link_rewrite;}
/** @param string $value */
public function setLinkRewrite($value) {$this->link_rewrite $this->replaceSpecialCharacter($value);}

/**
 * @Column
 */
protected $unitOfMeasure;

/**
* @Column(type="boolean")
*/
protected $translationReady false;
/** @return boolean */
public function getTranslationReady(){return $this->translationReady;}
/** @param boolean $value */
public function setTranslationReady($value){$this->translationReady $value;}

/**
 * @var \Entities\Backend\Translation
 * @OneToMany(targetEntity="\Entities\Backend\Translation", mappedBy="productLang")
 */
protected $translation;
/**
 * @return \Entities\Backend\Translation
 */
public function getTranslation(){
if (!$this->_getEntityManager()->contains($this))
return new \Entities\Backend\Translation;
if(is_null($this->translation)) {
$qb $this->_getEntityManager()
->getRepository('Entities\Backend\Translation')->createQueryBuilder('t')
->join('t.productLang''pl')
->where('pl.id = :id')
->setMaxResults(1)
->setParameter('id'$this->id);

$ret $qb->getQuery()->execute();

if (empty($ret)){
$translation = new \Entities\Backend\Translation;
$defaultStatus $this->_getEntityManager()->getReference('\Entities\Backend\TranslationStatus'2);
$translation->setStatus($defaultStatus);

$translation->setProductLang($this);
$translation->setComments('');
return $translation;
}
$this->translation $ret[0];
}
return $this->translation;
}

public function __construct(array $values = array()) {
        
parent::__construct($values);
}

public function _duplicate() {
$em $this->_getEntityManager();
$productLang = new ProductLang(array(
"unitOfMeasure" => $this->getUnitOfMeasure()
));
        
$em->persist($productLang);
/** Duplicate data */
$productLang->isActive($this->isActive());
$productLang->isDisplayed($this->isDisplayed());
$productLang->setDescription($this->getDescription());
$productLang->setLinkRewrite($this->getLinkRewrite());
$productLang->setLinkTitle($this->getLinkTitle());
$productLang->setMetaDescription($this->getMetaDescription());
$productLang->setMetaKeywords($this->getMetaKeywords());
$productLang->setMetaTitle($this->getMetaTitle());
$productLang->setName($this->getName());
/** Copy relations */
$productLang->setLanguage($this->getLanguage());
$productLang->setProduct($this->getProduct());
return $productLang;
}

public function __toString(){
return 'ID: '.$this->id."; NAME: ".$this->name '; LANG: ' $this->getLanguage()->getISO();

}
}

oraz Translation
<?php 

namespace Entities\Backend;

/**
 * @Entity
 * @Table(name="backend_translation")
 */
class Translation extends \Entities\Common\Entity{

/**
 * @Id
 * @Column(type="integer")
 * @GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ManyToOne(targetEntity="\Entities\Backend\TranslationStatus")
 */
protected $status;

/**
 * @return \Entities\Backend\TranslationStatus
 */
public function getStatus(){return $this->status;}
/**
 * @param \Entities\Backend\TranslationStatus $value
 */
public function setStatus(\Entities\Backend\TranslationStatus $value){$this->status $value;}



/**
 * @ManyToOne(targetEntity="\Entities\Shop\Product")
 */
protected $product;
/**
 * @return \Entities\Shop\Product
 */
public function getProduct(){return $this->product;}
/**
 * @param \Entities\Shop\Product $value
 */
public function setProduct(\Entities\Shop\Product $value){$this->product $value;}


/**
 * @ManyToOne(targetEntity="\Entities\Shop\ProductLang", inversedBy="translation")
 * @JoinColumn(name="productLang_id", referencedColumnName="id")
 */
protected $productLang;
/**
 * @return \Entities\Shop\ProductLang
 */
public function getProductLang(){return $this->productLang;}
/**
 * @param \Entities\Shop\ProductLang $value
 */
public function setProductLang(\Entities\Shop\ProductLang $value){$this->productLang $value;}


/**
 * @ManyToOne(targetEntity="\Entities\Common\Account")
 */
protected $editor;
/**
 * @return \Entities\Common\Account
 */
public function getEditor(){return $this->editor;}
/**
 * @param \Entities\Common\Account $value
 */
public function setEditor(\Entities\Common\Account $value){$this->editor $value;}

/**
 * @Column(type="text")
 * @var text
 */
protected $comments;
/**
 * @return text
 */
public function getComments(){return $this->comments;}
/**
 * @param text $value
 */
public function setComments($value){$this->comments $value;}

}

aktualna wersja zapytania
$defaultTranslation = $em->getReference('\Entities\Backend\Translation', '1');`

$qb = $em->getRepository("Entities\Shop\ProductLang")->createQueryBuilder("pl")
->join('pl.product', 'p')
->leftJoin('pl.translation', 't')
->add('select', 'coalesce(pl.translation, :defaultTranslation) as translation')->setParameter('defaultTranslation', $defaultTranslation)
->where("pl.translationReady = 0".$DQLwhere)
->orderBy($DQLorderBy, $DQLorderDir);`

Problem polega na tym że potrzebuje w przypadku braku wiesza translation podstawić domyślną wartość czyli to co jest w $defaultTranslation.
I pytanie czy jest jakiś sposób aby to zrobić (jeśli tak to jak?), czy łatwiej będzie użyć bezpośrednio zapytania SQL