/** * Prepares the query for the condition * @param \ride\library\orm\model\Model $model * @param \ride\library\orm\query\ModelQuery $query * @param string $fieldName Name of the filter field * @param string $conditionField Name of the model field to query on * @return boolean True when conditionField is set, false otherwise */ protected function prepareQuery(Model $model, ModelQuery $query, $fieldName, &$conditionField) { $orm = $model->getOrmManager(); $meta = $model->getMeta(); $fieldTokens = explode('.', $fieldName); $fieldTokenName = array_shift($fieldTokens); $field = $meta->getField($fieldTokenName); if ($field instanceof PropertyField) { return false; } elseif ($field instanceof BelongsToField) { $conditionField = $fieldTokenName; } else { $conditionField = $fieldTokenName . '.' . ModelTable::PRIMARY_KEY; } $numFields = count($fieldTokens); $numField = 0; $oldFieldTokenName = null; while ($numField <= $numFields) { if ($numField > 0) { $foreignKey = $meta->getRelationForeignKey($fieldTokenName); if ($field instanceof BelongsToField) { // $query->addJoin('LEFT', $relationModelName, $relationModelName, '{self.' . $oldFieldTokenName . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $oldFieldTokenName . '.' . $fieldTokenName; } elseif ($field instanceof HasManyField) { $relation = $meta->getRelationMeta($fieldTokenName); $foreignKey = $relation->getForeignKey(); $linkModelName = $relation->getLinkModelName(); // $relation->isRelationWithSelf(); // $relation->isHasManyAndBelongsToMany(); if ($linkModelName) { $foreignKeyToSelf = $relation->getForeignKeyToSelf($fieldTokenName); $query->addJoin('LEFT', $linkModelName, $linkModelName, '{' . $linkModelName . '.' . $foreignKeyToSelf . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $linkModelName . '.' . $foreignKey; } else { $linkRelationModelName = $meta->getRelationModelName($fieldTokenName); $foreignKeyToSelf = $meta->getRelationForeignKeyToSelf($fieldTokenName); $linkModel = $orm->getModel($linkRelationModelName); $linkMeta = $linkModel->getMeta(); $query->addJoin('LEFT', $linkRelationModelName, $linkRelationModelName, '{' . $linkRelationModelName . '.' . $foreignKey . '} = {' . $oldFieldTokenName . '.id}'); $conditionField = $linkRelationModelName . '.' . ModelTable::PRIMARY_KEY; } } } $oldMeta = $meta; $oldFieldTokenName = $fieldTokenName; $relationModelName = $meta->getRelationModelName($fieldTokenName); $relationModel = $orm->getModel($relationModelName); $meta = $relationModel->getMeta(); if ($fieldTokens) { $fieldTokenName = array_shift($fieldTokens); if ($fieldTokenName) { $field = $meta->getField($fieldTokenName); } } else { $fieldTokenName = null; } $numField++; } return true; }