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();
    }

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());