GET random Object mit Doctrine

Doctrine selbst hat keine ORDER BY rand() Funktion implementiert. Aber es gibt eine Lösung. Man lässt sich den total count der rows ausgeben und nutzt die PHP interne rand() Funktion um FirstResult zu definieren.

    /**
     * @return mixed
     */
    public function getTotal()
    {
        return $this->getEntityManager()->createQueryBuilder()
            ->select('COUNT(p.id)')
            ->from('AppBundle:Product', 'p')
            ->getQuery()
            ->getSingleScalarResult();
    }

    /**
     * @return mixed
     */
    public function getRandom()
    {
        return $this->getEntityManager()->createQueryBuilder()
            ->select('p')
            ->from('AppBundle:Product', 'p')
            ->setFirstResult(rand(0, $this->getTotal()-1))
            ->setMaxResults(1)
            ->getQuery()
            ->getSingleResult();
    }

SQL General error – 1553 Cannot drop index XYZ needed in a foreign key constraint

// show indexes of table
SHOW CREATE TABLE news;

// shows something like this
...
CONSTRAINT `FK_3A51546D12469DE2` FOREIGN KEY (`category_id`) REFERENCES `news_category` (`id`),
...

// drop index
ALTER TABLE news DROP FOREIGN KEY FK_3A51546D12469DE2;

Symfony2 Doctrine Table Join ohne Relation

Wer in Doctrine Tabellen joinen möchte ohne das diese durch Entity Relationen definiert sind, kann folgendermaßen vorgehen:


    public function getInvoicesNotInElster()
    {
        $query = $this->em->createQueryBuilder()
            ->select('i')
            ->from('AcmeAppBundle:Invoice', 'i')
            ->leftJoin('AcmeAppBundle:Elster', 'e', 'WITH', 'e.number = i.number_origin')
            ->where('i.cancelled = 0')
            ->andWhere('e.number IS NULL')
            ->getQuery();

        return $query->getResult();
    }

umkreissuche in mysql mit coordinaten (latitude, longitude)

wenn ihr eine schnelle lösung für eine umkreissuche benötigt, könnt ihr direkt in mysql geocoordinaten + distanzen errechnen.

# :dist = gewünschte entfernung in km (z.b 10)
# :lat = latitude der aktuellen position
# :lon = longitude der aktuellen position

SELECT
    id,
    latitude,
    longitude,
    (
        6371 * acos(
            cos(
                radians( :lat )
            ) * cos(
                radians( latitude )
            ) * cos(
                radians( longitude ) - radians( :lon )
            ) + sin(
                radians( :lat )
            ) * sin(
                radians( latitude )
            )
        )
    ) AS distance

FROM
    points_with_geocoordinates

HAVING
    distance <= :dist

ORDER BY
    distance ASC

doctrine create and drop table on the fly by orm

um in doctrine erst in der app tables anzulegen oder auch zu droppen kannst du ein yaml schema

MyTestOrm:
  tableName: my_test_table
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
      unsigned: true
    title:
      type: string(255)
      notnull: true
    created_at:
      type: timestamp
      notnull: true
  indexes:
    id:
      fields: [id]
    title:
      fields: [title]

anlegen und die orms daraus generieren.
dann kannst du in deiner app die table für die orm anlegen

Doctrine::createTablesFromArray(
    array(
        'MyTestOrm'
    )
);

bzw. auch wieder droppen

$table = Doctrine_Core::getTable('MyTestOrm');
$export = new Doctrine_Export();
$export->dropTable($table->getTableName());

ant task – mysqldump mit gzip

um mit ant einen gezipten mysqldump zu erstellen, gehe wie folgt vor

    <target name="tstamp" description="create timestamp for further usage">
        <echo message="create timestamp for further usage"/>
        <tstamp/>
    </target>

    <target name="mkdir" description="create backup directory">
        <echo message="create backup directory"/>
        <mkdir dir="${backups}"/>
    </target>

    <target name="dump" description="create db dump and gzip it - depends on tstamp, mkdir" depends="tstamp, mkdir">
        <echo message="create db dump and gzip it"/>
        <exec executable="bash" dir="${backups}">
            <arg value="-c"/>
            <arg line='"mysqldump ${db} -u${db_user} -p${db_pass} | gzip > ${backups}/${db}_${DSTAMP}_${TSTAMP}.sql.gz"'/>
        </exec>
    </target>