关于列和静态值的JoinColumns

时间:2016-06-13 20:14:51

标签: php doctrine sonata-admin sonata

我的sonata-admin设置中有两个表与Symfony2:'product''product_description'。第二个包含多种语言的产品描述,并将product_id和language_id列定义为复合主键。在产品表中没有language_id列,因此应根据客户选择的语言将其与描述动态连接。

我目前正在尝试通过OneToOneJoinColumns注释加入他们,但product_description如何将language_id作为静态值加入({1}}哪个不作为产品表中的列出现?)

/**
* ProductDescription
*
* @ORM\Table(name="product_description")
 * @ORM\Entity
 */
class ProductDescription
{

/**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $productId;

/*
 * @var boolean
 *
 * @ORM\Column(name="language_id", type="boolean")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $languageId;

....

}



/**
 * Product
 *
 * @ORM\Table(name="product")
 * @ORM\Entity
 */
class Product
{

/**
 * @var integer
 *
 * @ORM\Column(name="product_id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $productId;

 /**
 * @ORM\OneToOne(targetEntity="ProductDescription")
 * @ORM\JoinColumns({
 *      @JoinColumn(name="product_id", referencedColumnName="product_id"),
 *      @JoinColumn(name="??????", referencedColumnName="language_id")
 * })
 */
private $productDescription;

....

}

编辑:添加更多代码

// admin class
protected function configureListFields(ListMapper $listMapper)
{       
    $listMapper->addIdentifier('productId', 'integer')
        ->addIdentifier('productDescription.productName');
}

protected function configureFormFields(FormMapper $formMapper)
{   
    $formMapper->add('offersId', 'integer', array('read_only' => true))
        ->add('productDescription.productName');
}

我尝试在createQuery()方法中使用queryBuilder手动加入它,但是会在列表视图中给出奇怪的结果。

public function createQuery($context = 'list')
{
    $query = parent::createQuery($context);

    $query->addSelect('p')->innerJoin('AppBundle\Entity\ProductDescription', 'p', 'WITH', $query->getRootAlias().'.productId = p.productId and p.languageId = 2');

    return $query;
}

编辑:这是Hibernate中的一个类似问题 - 也许可以转化为学说?

https://forum.hibernate.org/viewtopic.php?f=1&t=986966

1 个答案:

答案 0 :(得分:0)

据我所知,您的模型中不存在“语言”,因此您无法与任何人建立关系。你可以做的只是创建一个字符串或整数列类型,并保持你的语言值:

 /**
  * @ORM\Column(type="string")
  * @var string
  */
 private $languageId

您可以使用会话区域设置或在模型中使用某些常量并进行有效ID的验证:

const LANGUAGE_ID_EN = 'en';
const LANGUAGE_ID_FR = 'fr';

public function setLanguageId($languageId)
{
    if ( ! in_array($$languageId, [...]) {
        throw new \Exception(...);
    }

    $this->languageId = $languageId;
}

然后您只需使用其他WHERE子句进行查询:

WHERE language_id = ?

我希望我帮到你。如果您的目标不同,请告诉我们。