【问题标题】:Doctrine SELECT in array type数组类型的学说 SELECT
【发布时间】:2018-03-12 10:15:27
【问题描述】:

我的项目有问题,array 输入教义。 我的实体获得了保存用户 ID 列表的字段用户列表。在我的数据库中,字段类型是 TEXT :

/**
 * @Column(type="array", nullable=false)
 */
private $userslist;

我这样创建我的内容:

$r->createNewLine(50, 'Name', 'Content', array(1, 5, 8))

我的字段用户列表在我的表格中的结果看起来像这样(我认为它是键 -> 值):

a:3:{i:0;i:1;i:1;i:5;i:2;i:8;}

我使用 QueryBuilder 来获取结果,这是我的请求:

$qb = $this->createQueryBuilder('r')
->andWhere('r.userslist IN (:userid)')
->setParameters(array('userid' => array(1)));

return $qb->getQuery()->getArrayResult();

结果我总是得到一个空数组。 我的表中有几行,用户列表字段中的用户 ID 为 1。

a:3:{i:0;i:1;i:1;i:5;i:2;i:8;}
a:3:{i:0;i:1;i:1;i:5;i:2;i:8;}
a:3:{i:0;i:9;i:1;i:4;i:2;i:2;}
a:3:{i:0;i:1;i:1;i:5;i:2;i:8;}
a:3:{i:0;i:9;i:1;i:4;i:2;i:2;}
...

我也尝试过使用表达式:

$qb->add('where', $qb->expr()->in('r.userslist', array(':userid')));

结果也是空的。 但是当我使用LIKE 时,它可以工作但不安全,因为我在表中的键和值之间感到困惑:

$qb = $this->createQueryBuilder('r')
    ->andWhere("r.userslist LIKE :userid")
   ->setParameters(array('userid' => '%i:1;%'));

如何在用户列表字段中获取用户 ID 1 所在的行?

谢谢

【问题讨论】:

    标签: php sql arrays doctrine-orm doctrine


    【解决方案1】:

    Doctrine 要求您解析整个字符串以找到直接匹配项,否则您似乎需要使用 LIKE 比较来根据选择的数据查找记录。这是一个类似的问题FOS bundle - How to select users with a specific role?

    为避免此问题,您是否考虑过创建另一个实体并在该实体与您的用户对象之间建立关系,这样您就不必依赖 LIKE 条件来查找数据。

    【讨论】:

    • 如果我想使用 LIKE 函数,我需要在创建行时发送 array(1 => 1, 5 => 5)。所以我可以使用i:1;i:1;,但它对我来说不是很干净......
    • 您是一次只搜索一个用户 ID,还是需要检查列表中的多个 ID 才能找到记录?
    • 一次只有一个用户
    • 尝试将类型更改为简单数组,如果您的 id 始终是唯一的,您可以运行类似查找值而不必担心找到键,因为它只使用分隔符来拆分价值。在此处查看更多详细信息docs.doctrine-project.org/projects/doctrine-dbal/en/latest/…
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2010-09-16
    • 2011-06-01
    • 2020-10-26
    • 2013-12-20
    相关资源
    最近更新 更多