/** * Custom finder for distance. * * Options: * - lat (required) * - lng (required) * - tableName * - distance * * @param \Cake\ORM\Query $query Query. * @param array $options Array of options as described above * @return \Cake\ORM\Query */ public function findDistance(Query $query, array $options) { $options += ['tableName' => null]; $sql = $this->distance($options['lat'], $options['lng'], null, null, $options['tableName']); $query->select(['distance' => $query->newExpr($sql)]); if (isset($options['distance'])) { // Some SQL versions cannot reuse the select() distance field, so we better reuse the $sql snippet $query->where(['(' . $sql . ') <' => $options['distance']]); } return $query->order(['distance' => 'ASC']); }
/** * {@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; }
/** * Custom finder to get all rows (`trashed` or not). * * @param \Cake\ORM\Query $query Query. * @param array $options Options. * @return \Cake\ORM\Query */ public function findWithTrashed(Query $query, array $options) { return $query->where(['OR' => [$query->newExpr()->isNotNull($this->getTrashField()), $query->newExpr()->isNull($this->getTrashField())]]); }
/** * Custom finder for distance. * * Options: * - lat (required) * - lng (required) * - tableName * - distance * - sort * * @param \Cake\ORM\Query $query Query. * @param array $options Array of options as described above * @return \Cake\ORM\Query */ public function findDistance(Query $query, array $options) { $options += ['tableName' => null, 'sort' => true]; $sql = $this->distanceExpr($options['lat'], $options['lng'], null, null, $options['tableName']); if ($query->autoFields() === null) { $query->autoFields(true); } $query->select(['distance' => $query->newExpr($sql)]); if (isset($options['distance'])) { // Some SQL versions cannot reuse the select() distance field, so we better reuse the $sql snippet $query->where(function ($exp) use($sql, $options) { return $exp->lt($sql, $options['distance']); }); } if ($options['sort']) { $sort = $options['sort'] === true ? 'ASC' : $options['sort']; $query->order(['distance' => $sort]); } return $query; }
public function findFemaleRatio(Query $query, $options = []) { $allManagers = $this->find()->select($query->func()->count('*')); return $query->find('female')->select(['female_ratio' => $query->newExpr($query->func()->count('*'))->add($allManagers)->type('/')]); }
/** * Custom finder for distance. * * Used to be a virtual field in 2.x via setDistanceAsVirtualField() * * Options: * - lat (required) * - lng (required) * - tableName * - distance * * @param \Cake\ORM\Query $query Query. * @param array $options Array of options as described above * @return \Cake\ORM\Query */ public function findDistance(Query $query, array $options) { $options += array('tableName' => null); $sql = $this->distance($options['lat'], $options['lng'], null, null, $options['tableName']); $query->select(['distance' => $query->newExpr($sql)]); if (isset($options['distance'])) { $query->where(['distance <' => $options['distance']]); } return $query->order(['distance' => 'ASC']); }