/** * @param Metadata $metadata * @param $query * @param array $bind * @param Connection $db */ public function __construct(Metadata $metadata, $query, array $bind = null, Connection $db = null) { $this->metadata = $metadata; if (null !== $db) { $this->db = $db; } else { $this->db = $metadata->getDbConnection(); } $selectAllFields = []; $dbCols = $this->metadata->getDbColNames(); foreach ($dbCols as $colName) { $selectAllFields[] = 't.' . $this->qi($colName); } $query = str_ireplace(['select *', ':t'], ['SELECT ' . implode(', ', $selectAllFields), $this->qi($this->metadata->getDbTableName()) . ' t'], $query); // auto replace :field_name placeholders by their quoted db column names $query = preg_replace_callback('/:(\\w+)/', function ($matches) use($metadata) { if ($metadata->__isset($matches[1])) { return $this->qi($metadata->getField($matches[1])->db_column); } else { return $matches[0]; } }, $query); $this->queryStringCache = $query; // other :somename placeholders treated as prepared statement bindings if (null !== $bind) { $this->bind($bind); } $this->returnObjects(); }
/** * @param Metadata $metadata * @param QueryBuilder $qb * @param Connection $db */ public function __construct(Metadata $metadata, QueryBuilder $qb = null, Connection $db = null) { $this->metadata = $metadata; if (null !== $db) { $this->db = $db; } else { $this->db = $metadata->getDbConnection(); } if (null !== $qb) { $this->qb = $qb; } else { $this->qb = new QueryBuilder($this->db); $this->qb->from($this->qi($metadata->getDbTableName()), $this->qi('t')); } $this->lookuper = \Dja\Db\Model\Lookup\LookupAbstract::getInstance($this->db); }
/** * @param Metadata $metadata * @return Table */ public function metadataToTable(Metadata $metadata) { $tblName = $metadata->getDbTableName(); if (isset($this->md2tableCache[$tblName])) { return $this->md2tableCache[$tblName]; } $cols = []; foreach ($metadata->getLocalFields() as $fieldObj) { $col = $fieldObj->getDoctrineColumn(); $col->setLength($fieldObj->max_length); $col->setNotnull(!$fieldObj->null); $col->setComment($fieldObj->help_text); $col->setAutoincrement($fieldObj->auto_increment); $cols[] = $col; } $table = new Table($tblName, $cols); $this->md2tableCache[$tblName] = $table; foreach ($metadata->getLocalFields() as $fieldObj) { if ($fieldObj->unique) { $table->addUniqueIndex([$fieldObj->db_column]); } elseif ($fieldObj->db_index) { $table->addIndex([$fieldObj->db_column]); } if ($fieldObj->primary_key) { $table->setPrimaryKey([$fieldObj->db_column]); } if ($this->followRelations === true && $fieldObj instanceof ForeignKey) { $relationClass = $fieldObj->relationClass; $relationTable = $this->metadataToTable($relationClass::metadata()); $table->addForeignKeyConstraint($relationTable, [$fieldObj->db_column], [$fieldObj->to_field]); $this->generateQueue[] = $relationClass; } } if ($this->followRelations === true) { foreach ($metadata->getRelationFields() as $fieldObj) { if ($fieldObj instanceof ManyToMany) { if ($fieldObj->throughClass) { $throughClass = $fieldObj->throughClass; //$this->metadataToTable($throughClass::metadata()); $this->generateQueue[] = $throughClass; } } } } return $table; }