标签: doctrine-query

在实体表单字段中创建查询

我需要获取国家/地区列表,按字母顺序排序.由于我将实体翻译成四种语言(英语,法语,西班牙语和中文),我使用了gedmo学说扩展来管理翻译.问题是当我在实体表单字段类型中获取此列表时:

$form = $builder->add('country', 'entity', 
array('class' => 'GroupCommonBundle:Country',
      'query_builder' => function(EntityRepository $er) {
                  $query = $er->createQueryBuilder('c')->orderBy('c.name');
       }
Run Code Online (Sandbox Code Playgroud)

结果按原始实体定义(英语)而非当前语言环境(西班牙语或法语)排序,我真正需要的是什么.其实我用的$this->container->getParameter('locale')

我试图迫使查询钩,如解释在这里:

$query->getQuery()->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));
Run Code Online (Sandbox Code Playgroud)

但是AFAIK,这只有在查询写成dql时才有效:

    $query = $this->getDoctrine()->getManager()->createQuery('
            SELECT c
            FROM GroupCommonBundle:Country c
            ORDER BY c.name ASC');
    $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));
Run Code Online (Sandbox Code Playgroud)

实体表单不允许这样做,因为它正在等待queryBuilder对象.

所以,我需要翻译我的收藏并以他当前的语言排序.谁知道如何实现这一目标?

doctrine-query symfony doctrine-orm

8
推荐指数
1
解决办法
1414
查看次数

如何在学说中编写联合查询?

我想在doctrine中使用union,我搜索了很多但没有得到任何成功,这是我在sql中的union查询,如何在doctrine中转换这个查询?

select * from (select orderid,tutorialId,points,allow_multiple,question,answer1,image1,correct1,answer2,image2,correct2,answer3,image3,correct3,answer4,image4,correct4,answer5,image5,correct5,'1' as istest,'' as content,'' as media,'' as media_type_id from tutorial_test

union

select orderid,tutorialId,'0' as istest,content,media,media_type_id,'' as points,'' as allow_multiple,'' as question,'' as answer1,'' as image1,'' as correct1,'' as answer2,'' as image2,'' as correct2,'' as answer3,'' as image3,'' as correct3,'' as answer4,'' as image4,'' as correct4,'' as answer5,'' as image5,'' as correct5  from tutorial_elements) a where a. tutorialId = 1 order by orderid asc
Run Code Online (Sandbox Code Playgroud)

这一个是我的学说查询

    $query  = "SELECT * FROM(SELECT
                    tt.tutorialid
                FROM
                    TutorialTest tt
                UNION …
Run Code Online (Sandbox Code Playgroud)

mysql orm doctrine doctrine-query doctrine-orm

8
推荐指数
1
解决办法
7283
查看次数

如何使用多个数据库模式管理Doctrine查询

我有一个实体A,其关系是ManyToOne与B,但A和B不属于同一个DB模式.

实体"A"属于MyBundle包,实体"B"属于MyOtherBundle包.

官方文档说明了如何使用不同的连接:多个模式=多个实体管理器.但就我而言,我想加入两个实体.

通过做 :

$this->objEm->getRepository('MyBundle:MyEntity')->find($id);
Run Code Online (Sandbox Code Playgroud)

要么

$this->objEm->getRepository('MyBundle:MyEntity')->getMyResult($id);
Run Code Online (Sandbox Code Playgroud)

我只调用我的一个存储库,我猜他无法得到另一个,因为在我的config.yml中我只能选择一个连接.

doctrine:
  dbal:
   connections:
     connection1:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema1_user%"
       password: "%database_schema1_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"
     connection2:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema2_user%"
       password: "%database_schema2_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"

orm:
  entity_managers:
    em1:
      connection:       connection1
      mappings:
              MyBundle: ~
              MyOtherBundle: ~
    em2:
      connection:       connection2
      mappings:
              MyOtherBundle: ~
Run Code Online (Sandbox Code Playgroud)

结果:糟糕,看起来出了问题.

1/1ReflectionException:类FQCN\Of\MyBundle\Entity\B不存在...

"我知道它不存在,我希望你现在看看好地方:比如在FQCN\Of\MyOtherBundle\Entity\B"

如何强制实体'B'的路径?

php doctrine-query symfony doctrine-orm

7
推荐指数
1
解决办法
2015
查看次数

带有codeigniter外键插入的doctrine2

我遵循数据库架构 -

数据库架构

现在部门,年份和部门表已经填满了信息.

我现在需要插入学生数据.学生数据将从xls文件导入(导入和解析部分已完成).正如您在架构中看到的那样,表中的列student_data引用year_id,department_didivision_id.因此,在插入时我需要他们的ID字段,因为xls具有各自的名称值.

所以我要根据每个学生的列值来获取相应的ID.因此,这引入了3个查询,用于在学生表中插入一条记录.像这样 -

forloop(...):
     $studentData = new Entities\StudentData();

    $year =  $this->em->getRepository("Entities\Year")->findBy(array('year_name' => $this->year[$i]));
    $department =  $this->em->getRepository("Entities\Department")->findBy(array('department_name' => $this->branch[$i]));
    $division =  $this->em->getRepository("Entities\Division")->findBy(array('division_name'=>$this->division[$i]));

    $studentData->setYear($year[0]);
    $studentData->setDepartment($department[0]);
    $studentData->setDivision($division[0]);

    //other data
    .
    .
    .
    .
    .
    $this->em->persist($studentData);

endforloop();   

$this->em->flush();
$this->em->clear();
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我将为每个部门,年份和部门获得ID循环.假设我正在导入100个学生列表,因此它最终会运行300个查询来获取这3个ID字段.

我可以在插入数据时直接从他们的名字中获取年份,部门和部门的ID吗?我是学说的新手,我不知道如何去做.


更新 如果问题不清楚,请告诉我.我可以用更多细节更新它或重组它.

php mysql codeigniter doctrine-query doctrine-orm

7
推荐指数
1
解决办法
611
查看次数

使用Doctrine获取多行单列数组

我有这样的Doctrine fetch语句

$query = "SELECT id FROM table LIMIT 2";
$result = $db->fetchAll($query);
Run Code Online (Sandbox Code Playgroud)

它返回这样的数组:

Array
(
[0] => Array
    (
        [id] => 1
    )

[1] => Array
    (
        [id] => 2
    )
)
Run Code Online (Sandbox Code Playgroud)

由于我获取的唯一列是ID,我不需要数组范围那么深.是否有一种方便的方法使Doctrine将结果返回到"平面"数组中,类似于PDO的作用:

$result = $db->query($query)->fetchAll(PDO::FETCH_COLUMN);
Run Code Online (Sandbox Code Playgroud)

将返回

Array
(
    [0] => 1
    [1] => 2
)
Run Code Online (Sandbox Code Playgroud)

目前我正在使用它

$result = call_user_func_array('array_merge', array_map("array_values", $result));
Run Code Online (Sandbox Code Playgroud)

php mysql pdo doctrine doctrine-query

6
推荐指数
2
解决办法
6523
查看次数

Symfony2 Doctrine Querybuilder全选

我目前正在使用SF2中的服务,该服务使用在本服务的构造函数中使用特定于存储库的QueryBuilder的类变量集来使用QueryBuilder查询数据库.这意味着我想尽可能地使用这个集合QueryBuilder来获得更整洁的代码和使用它的干净感觉.

我想避免在EntityManager上创建查询,而是仅使用此预定义的Querybuilder进行查询.

我正在寻找看起来像以下那样的东西:

$query = $this->fooRepository->createQueryBuilder('f')->select('*');
return $query->getResult(Query::HYDRATE_ARRAY);
Run Code Online (Sandbox Code Playgroud)

据我所知,以上将(如果它工作)返回数据库中的所有foo ..

如果您认为我是愚蠢的,应该对预定义的QueryBuilders做一些不同的事情,或者只使用:

createQuery()
Run Code Online (Sandbox Code Playgroud)

方法,因为它根本不是好的做法或不可能,不要犹豫告诉我.

谢谢!

php query-builder doctrine-query symfony doctrine-orm

6
推荐指数
1
解决办法
1万
查看次数

Doctrine - 查询一对多,单向与来自反向的连接表关联

我的目标是:

创建通用关联,其中第一个实体(例如,类别)可以多次用于其他对象(例如,帖子,文章)

帖子有类别,文章有类别,但文章和帖子是完全不同的实体.(两者不能同时连接)


映射示例:

岗位

<?php
/** @Entity */
class Post
{
    // ...

    /**
     * @ManyToMany(targetEntity="Category")
     * @JoinTable(name="post_categories",
     *      joinColumns={@JoinColumn(name="post_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $categories;

    public function __construct()
    {
        $this->categories= new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

文章

<?php
/** @Entity */
class Article
{
    // ...

    /**
     * @ManyToMany(targetEntity="Category")
     * @JoinTable(name="article_categories",
     *      joinColumns={@JoinColumn(name="article_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $categories;

    public function __construct()
    {
        $this->categories= new …
Run Code Online (Sandbox Code Playgroud)

php mysql doctrine-query symfony doctrine-orm

6
推荐指数
1
解决办法
4213
查看次数

Doctrine dql select as 带空格

我想知道是否可以为列名添加空格,例如

$query = "SELECT u.firstName AS 'First Name' FROM User u";
$result = $query->getResult( Query::HYDRATE_ARRAY );
Run Code Online (Sandbox Code Playgroud)

mysql doctrine-query doctrine-orm

6
推荐指数
0
解决办法
1150
查看次数

Doctrine DQL:如何将表达式反转到反面

我希望获取一个不存在反向关联的实体(在1:1关联上)

我收到错误:

DQL查询中不支持反向的单值关联路径表达式.请改用显式连接.

查询:

$query = $this->getEntityManager()->createQuery("
                SELECT DISTINCT(p.date)
                FROM MainBundle:Price p
                WHERE p.emaPrice IS NULL
                ORDER BY p.date ASC
            ")
            ->setMaxResults(1);
        $date = $query->getOneOrNullResult();
Run Code Online (Sandbox Code Playgroud)

我理解错误,但我真的不肯修复它.我已经读过我应该添加一个明确的JOIN,但我已经添加了它,但仍然没有运气.

带连接的EDIT查询:

$query = $this->getEntityManager()->createQuery("
        SELECT DISTINCT(p.date)
        FROM MainBundle:Price p
        JOIN MomentumBundle:EmaPrice ep
        WITH ep.id = p.emaPrice
        WHERE p.emaPrice IS NULL
        ORDER BY p.date ASC
    ")
    ->setMaxResults(1);
$date = $query->getOneOrNullResult();
Run Code Online (Sandbox Code Playgroud)

dql doctrine-query symfony doctrine-orm

5
推荐指数
1
解决办法
5394
查看次数

Doctrine 查询:删除限制

我正在尝试使用 Doctrine 中的删除查询仅删除 x 个对象。并且由于学说中没有 LIMIT,我们应该使用 $query->setMaxResults($limit) 来代替。我正在使用 Symfony2。

但是,它不适用于以下查询(无论是否使用 $query->setMaxResults($limit),它都会删除所有内容而不是删除 $limit 第一个实体)。

$limit = 10;
$query = $entityManager->createQuery(
        'DELETE FROM MyProject\Bundle\MyBundle\Entity\MyEntity myEntity
         WHERE myEntity.cost = 50'
    )
$query->setMaxResults($limit);
$query->execute();
Run Code Online (Sandbox Code Playgroud)

doctrine dql doctrine-query symfony doctrine-orm

5
推荐指数
1
解决办法
1836
查看次数