【问题标题】:How can I filter my doctrine request by the values of an array?如何通过数组的值过滤我的学说请求?
【发布时间】:2020-01-28 13:56:34
【问题描述】:

我正在使用学说从我的数据库中加载数据:

$data = $this->em->getRepository('App\\Entity\\Data')->allData();

这会创建一个包含大量数据的数组:

PagesGenerator.php on line 259:
array:1696 [▼
  0 => Data^ {#5430 ▼
    -id: 2298
    -uuid: "426441e418"
    -content: "two"
    -document_id: "93b7dc32f4"
  }
  1 => Data^ {#5434 ▼
    -id: 2299
    -uuid: "c1474a87a9"
    -content: ""
    -document_id: "93b7dc32f4"
  }
  2 => Data^ {#5413 ▼
    -id: 2300
    -uuid: "8bfd9b4893"
    -content: "three"
    -document_id: "edb8fa9647"
  }
  3 => Data^ {#5427 ▶}
  4 => Data^ {#5428 ▶}
  5 => Data^ {#5433 ▶}
  6 => Data^ {#5431 ▶}
  7 => Data^ {#5429 ▶}

我还有另一个数组$docIds:

array:96 [▼
  0 => "3019b7a82f"
  1 => "b1a4c67080"
  2 => "82cf4392d7"
  3 => "55768e0955"
  4 => "74c6217001"
  5 => "71fc4c3ebf"
  6 => "35e2d3a1c6"
  7 => "50c940b223"
  8 => "2561ff454d"
  9 => "bb447530e1"

为了获得更快的性能,我喜欢对数组 $data 进行预过滤,使其仅包含带有 document_ids 的条目,这些条目是我的数组 $docIds 中的值;

这是我的方法:

$data = $this->em->getRepository('App\\Entity\\Data')->filterByDocID($docIds);

在我的数据存储库中:

public function filterByDocID($array)
{
  $query = $this->getEntityManager()
  ->createQuery(
    "SELECT a
    FROM App\Entity\Data a
    WHERE document_id IN ('".$array."')");
    try {
      return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
      return null;
    }
  }

但我收到错误消息:

注意:数组到字符串的转换

【问题讨论】:

标签: php arrays database symfony doctrine


【解决方案1】:

有两种可能。

正如他们已经写的那样,你可以内爆你的数组。

WHERE document_id IN ('".implode(',', $array)."')");

或者你正在绑定数组。

$stmt->bindValue(0, array(123, 234, 345, 456, 567, 678));

我更喜欢绑定数组,因为这比内爆和解析为字符串要干净得多。

E:

由于您使用字符串作为 id,请尝试以下操作:

WHERE document_id IN ('".implode("', '", $array)."')");

否则尝试使用 LIKE

【讨论】:

  • 谢谢,我的错误消失了,但现在我又收到一个错误[Semantical Error] line 0, col 54 near 'document_id IN': Error: 'document_id' is not defined.
  • 尝试 a.document_id
  • 好的,现在所有错误消息都消失了,但dump($data) 的输出为空[]。我只尝试了你的内爆版本,因为另一个建议我不确定我的查询中我需要在哪里进行绑定
  • 更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2018-11-03
  • 2017-05-26
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多