/** * {@inheritdoc} */ public function apply($fromAlias, $fromIdentifier, $resourcePrefix, array $requesterIdentifiers, $mask, array $orX = []) { $this->query->join(['table' => $this->getAclSchema()->getPermissionsTableName(), 'alias' => 'acl_p', 'type' => 'LEFT', 'conditions' => $this->query->newExpr()->eq('acl_p.resource', $this->query->func()->concat([':acl_resource_prefix' => 'literal', $fromAlias . '.' . $fromIdentifier => 'literal']))]); $orX[] = $this->query->newExpr()->and_([$this->query->newExpr()->in('acl_p.requester', $requesterIdentifiers, 'string'), $this->query->newExpr(':acl_mask = (acl_p.mask & :acl_mask)')]); $this->query->andWhere($this->query->newExpr()->or_($orX)); $this->query->bind(':acl_resource_prefix', $resourcePrefix); $this->query->bind(':acl_mask', $mask, 'integer'); return $this->query; }
/** * Find Matches * * Assemble a query containing one or more MATCH() AGAINST() clauses * @param \Cake\ORM\Query $query Query to modify * @param array $options Options for the query * @throws SearchableException If keys 'match' or 'against' are not set * @throws SearchableException If columns are invalid * @return \Cake\ORM\Query */ public function findMatches(Query $query, array $options) { $conditions = []; $options = array_values($options); //assemble MATCH() AGAINST() clauses foreach ($options as $key => $option) { if (!isset($option['match']) || !isset($option['against'])) { throw new SearchableException("Keys 'match' and 'against' must be set"); } if ($this->_validateColumns($option['match'])) { $conditions[$key] = "MATCH({$option['match']}) AGAINST (:match{$key} "; if (isset($option['mode'])) { if (in_array($option['mode'], $this->_modesWhitelist)) { $conditions[$key] .= $option['mode'] . ' '; } } $conditions[$key] .= ")"; } } $query->find('all', ['conditions' => $conditions]); //bind params foreach ($options as $key => $option) { $query->bind(":match{$key}", $option['against']); } return $query; }