public function hasManySet($field, array $thatIds, $excludeId = null)
{
$thisField = $this->definition->getSubTypeField($field, 'many', 'thisField');
$thatField = $this->definition->getSubTypeField($field, 'many', 'thatField');
$thatEntity = $this->definition->getSubTypeField($field, 'many', 'entity');
$entityTable = $this->definition->getServiceProvider()->getData($thatEntity)->getDefinition()->getTable();
$queryBuilder = $this->database->createQueryBuilder();
$queryBuilder->select('t1.`' . $thisField . '` AS this, t1.`' . $thatField . '` AS that')->from('`' . $field . '`', 't1')->leftJoin('t1', '`' . $entityTable . '`', 't2', 't2.id = t1.`' . $thatField . '`')->where('t2.deleted_at IS NULL')->orderBy('this, that');
if ($excludeId !== null) {
$queryBuilder->andWhere('t1.`' . $thisField . '` != ?')->setParameter(0, $excludeId);
}
$existingMany = $queryBuilder->execute()->fetchAll(\PDO::FETCH_ASSOC);
$existingMap = array_reduce($existingMany, function (&$carry, $existing) {
$carry[$existing['this']][] = $existing['that'];
return $carry;
}, []);
sort($thatIds);
return in_array($thatIds, array_values($existingMap));
}