【问题标题】:I would like to get the records related to text by DQL我想通过 DQL 获取与文本相关的记录
【发布时间】:2014-04-12 10:28:23
【问题描述】:

数据库:

id | name     | // ...
====================
1  | London   |
2  | Paris    |
3  | Moscow   |
4  | New York |

// ...

文字:

This is a big city. I live in this town.
I like the name of city. 'New York' is very cool.
However, I have to go to Moscow this summer.
// ...

数据库中有很多记录。
文字是用各种语言编写的。

我想获取与文本相关的记录。
在这种情况下,我想获取“纽约”和“莫斯科”的记录。

我正在使用 Doctrine2 ORM 和 DQL。
而我的数据库一般是mysql。

是否可以通过使用 DQL 来实现?


更新

城市实体:id、名称、人口创建日期等...

id | name     | population | // ...
====================================
1  | London   | 1,2448,3938| 
2  | Paris    | 1,8759,4844|
3  | Moscow   |12,8450,3748|
4  | New York | 8,4795,8558|

// ...

文章实体:id、body、author、date_created 等...

id | body                                        | // ...
============================================================
1  | This is a big city. I live in this town.    |
   | I like the name of city.                    |
   | 'New York' is very cool.                    |
   | However, I have to go to Moscow this summer.|
   | // ...                                      | 
2  | We bought a house in London.  //...         |
3  | I go to Canada this weekend.  //...         |
4  | Weather in Africa today is too bad. //...   |

// ...

无论是来自文件还是数据库,文本都很好。

public function findOneById($id)
{
    $query = $this->getEntityManager()->createQuery('
        SELECT a, u
        FROM MyArticleBundle:Article a
        LEFT JOIN a.author u
        WHERE a.id = :id
    ')
    ->setParameter('id', $id);

    return $this->try_catch($query);
}

or

$article = file_get_contents('example.txt');

然后我把它带到显示器上。

{{ article }} or {{ article.body }} etc...

此时,如何获取与本文相关的城市数据?
是否需要复杂的数据库配置?

文本和实体(在本例中为“城市”数据)没有关联。
是否有可能获得文本或字符串中出现的数据?

如:SELECT c FROM MyExampleBundle:City c WHERE c.name appear in ({$text});

虽然我知道这个例子是不可能的,但我想知道在 DQL 中是否有一种方法可以轻松获得。

【问题讨论】:

  • 是否要获取nametext 字段包含“纽约”和“莫斯科”的记录?请添加有关您的实体的更多信息,我们无法在没有实体名称的情况下构建查询。
  • 感谢您的评论。我添加了上面的描述。
  • 您问题的第一部分是否仍未得到解答?我建议将最后一个问题移至一个新问题。如果没有关于实体如何关联的信息,很难回答最后一个问题。
  • 对不起我的英语,我现在不知道它是否需要复杂的数据库配置。我的问题很简单。文本和实体(在本例中为“城市”数据)没有关联。我是否有可能获得出现在文本或字符串中的数据?如:where city.name in ({$text})。虽然我知道这个例子是不可能的,但我想知道在 DQL 中是否有一种方法可以轻松获得类似的。
  • 请再次阅读您的问题,很难理解您的问题的意义何在。请参阅doctrine2 documentation about association 来关联您的两个实体。

标签: mysql symfony doctrine-orm dql doctrine-query


【解决方案1】:

在这种情况下,我想获取“纽约”和“莫斯科”的记录。

因此,您需要将like() function% 字符一起使用。 % 将充当通配符,例如A% 将选择所选字段以A 开头的每一行。而%A% 将选择包含A 的每一行。

public function findArticlesFromTowns($town_1, $town_2)
{
    $qb = $this->createQueryBuilder('u');

    $buffer = $qb
        ->select('a, u')
        ->leftJoin('a.author', 'u')
        ->where(
            $qb->expr()->andX(
                $qb->expr()->like('a.body',
                    $qb->expr()->literal('%'.$town_1.'%')),
                $qb->expr()->like('a.body',
                    $qb->expr()->literal('%'.$town_2.'%'))
            )
        )
    ;

    $q = $buffer->getQuery();

    return $q->getResult();
}

$town_1$town_2 分别是 纽约莫斯科。通过使用andX(),查询将选择body 字段包含纽约 莫斯科的所有行。

【讨论】:

  • 不不不...我的英语太差了?呃……在这种情况下,我不知道文本中包含的城市是哪里。我的要求是我想获取出现在我不知道内容的文本中的城市数据。这是一张图片:SELECT c FROM MyExampleBundle:City c WHERE c.name appear in ({$text});
  • 城镇名称的位置没有问题,查询将获取包含城镇名称的行,它们可以在文本中的任何位置。
  • 您的回答是我知道文本中包含的城市名称。如果是这样的话,我可以做到。我不想获取包含特定城市名称的文章数据。我想获取城市名称包含在文本中的城市数据。我不知道文本的内容。我不知道文本中包含哪个城市名称。
  • 我引用了你问题中的一句话,我认为我的回答是正确的。如果您不知道城市名称,为什么要问 New YorkMoscow
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多