/**
  * Gets the file name for a newly uploaded file
  * @param \ride\library\orm\model\Model $model
  * @param \ride\library\orm\definition\field\ModelField $field
  * @param \ride\library\orm\entry\Entry $entry
  * @return string Name for the file without path and extension
  */
 protected function getFileName(Model $model, ModelField $field, Entry $entry)
 {
     $entryFormatter = $model->getOrmManager()->getEntryFormatter();
     $format = $model->getMeta()->getFormat(EntryFormatter::FORMAT_TITLE);
     $name = $entryFormatter->formatEntry($entry, $format);
     if ($name) {
         $name = StringHelper::safeString($name);
     } else {
         $name = StringHelper::generate();
     }
     return $name;
 }
 /**
  * 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;
 }