Extbase - Query Objekt: Unterschied zwischen den Versionen
| Zeile 42: | Zeile 42: | ||
== Beipiele == | == Beipiele == | ||
| + | |||
=== Beispiel: Sortierreihenfolge === | === Beispiel: Sortierreihenfolge === | ||
Für angepasste Sortierungen reicht es '''im Repository das Array $defaultOrderings zu überschreiben.''' | Für angepasste Sortierungen reicht es '''im Repository das Array $defaultOrderings zu überschreiben.''' | ||
| Zeile 53: | Zeile 54: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
=== Beispiel: FE-User by uid und by group finden === | === Beispiel: FE-User by uid und by group finden === | ||
| Zeile 102: | Zeile 104: | ||
Die Funktionen werden dann im '''Controller''' aufgerufen z.B. | Die Funktionen werden dann im '''Controller''' aufgerufen z.B. | ||
<syntaxhighlight lang="php">$mail->setFeuser( $this->userRepository->findByUid(Div::getPropertyFromLoggedInFeUser('uid')) );</syntaxhighlight> | <syntaxhighlight lang="php">$mail->setFeuser( $this->userRepository->findByUid(Div::getPropertyFromLoggedInFeUser('uid')) );</syntaxhighlight> | ||
| + | |||
| + | |||
=== Beispiel: Mehrere Conditions auf die Abfrage anwenden === | === Beispiel: Mehrere Conditions auf die Abfrage anwenden === | ||
Wenn du mehrere Filter brauchst oder etwas anderes als ein uid=4 Abfrage, dann erstelle ein Query Objekt mit mehreren Conditions | Wenn du mehrere Filter brauchst oder etwas anderes als ein uid=4 Abfrage, dann erstelle ein Query Objekt mit mehreren Conditions | ||
| Zeile 134: | Zeile 138: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
| + | |||
=== Beispiel: Kommaseparierte Liste für Abfrage === | === Beispiel: Kommaseparierte Liste für Abfrage === | ||
http://www.buero-sonne.de/2014/10/16/mysql-orderby-field-in-extbase.html | http://www.buero-sonne.de/2014/10/16/mysql-orderby-field-in-extbase.html | ||
Version vom 29. Juni 2015, 07:32 Uhr
Siehe auch:
Extbase - Sortierung und Abfrage von Objekten
http://mbless.de/blog/2015/03/05/typo3-extbase-query-methods.html
http://lbrmedia.net/codebase/Eintrag/extbase-query-methods/
Das Query Object steuert Abfragen auf die Datenbank. Wenn man z.B. findAll() im Controller ausführt, werden die Parameter für die Abfrage aus diesem Objekt geholt.
Übersicht
Allgemeines Vorgehen
Einfache Anfragen
Einfache Anfragen z.B. Filtern nach einer bestimmten Eigenschaft (Property) geht mit der findBy[property] Methode. Nach der uid sucht man z.B. mit.
findByUid(42)
findOneByName('foo') // gibt nur das erste zurück
Das geht mit allen Eigenschaften im Model (findByName, findByIrgendwas)
Speziellere Queries
Für spezielle Queries erstellt man mit
$this->createQuery()
ein neues Query Objekt. Diesem gibt man dann Conditions und Sortierungen mit. Wichtige Methoden sind z.B. matching(), execute() und setOrderings())
Daten im Controller nachbearbeiten
SQL wird normalerweise ausgeführt, wenn der ViewHelper des Fluid Templates Daten anfordert, also nachdem der Controller abgearbeitet ist. Das ist ein Problem wenn man die Daten noch im Controller bearbeiten will. Man kann die Daten aber auch im Controller durchgehen, bearbeiten und dann wieder dem Fluid Template übergeben.
repository->findAll() as $object)
{
$object->SetWhatEver(42);
$array[] = $object;
}
$this->view->assign('list', $array);
Group By
Das wird von Extbase nicht erzeugt. Aber es gibt einen GroupFor View Helper. Ansonsten kann man auch auf eigene Queries ausweichen.
Eigene Queries
Todo
Beipiele
Beispiel: Sortierreihenfolge
Für angepasste Sortierungen reicht es im Repository das Array $defaultOrderings zu überschreiben.
class DeviceRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
protected $defaultOrderings = array(
'deviceClass.classTitle' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING,
'deviceTitle' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
//'date' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
);
}
Beispiel: FE-User by uid und by group finden
Aus Powermail (gekürzt)
Repository
use TYPO3\CMS\Extbase\Persistence\Repository;
/**
* UserRepository
*
* @package powermail
* @license http://www.gnu.org/licenses/lgpl.html
* GNU Lesser General Public License, version 3 or later
*/
class UserRepository extends Repository {
/**
* Find FE_Users by their group
*
* @param int $uid fe_groups UID
* @return \TYPO3\CMS\Extbase\Persistence\Generic\QueryResult
*/
public function findByUsergroup($uid) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->matching(
$query->contains('usergroup', $uid)
);
return $query->execute();
}
/**
* Find by Uid but don't respect storage page
*
* @param \int $uid
* @return \In2code\Powermail\Domain\Model\User
*/
public function findByUid($uid) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->matching(
$query->equals('uid', $uid)
);
return $query->execute()->getFirst();
}
}
Die Funktionen werden dann im Controller aufgerufen z.B.
$mail->setFeuser( $this->userRepository->findByUid(Div::getPropertyFromLoggedInFeUser('uid')) );
Beispiel: Mehrere Conditions auf die Abfrage anwenden
Wenn du mehrere Filter brauchst oder etwas anderes als ein uid=4 Abfrage, dann erstelle ein Query Objekt mit mehreren Conditions
public function findNonPublicByTest(\TYPO3\MyExt\Domain\Model\Test $test) {
$query = $this->createQuery();
$condition1 = $query->equals('public', false);
$condition2 = $query->equals('test', $test);
$condition = $query->logicalAnd($condition1, $condition2);
$query->matching($condition);
$query->setOrderings(array('titel' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING));
return $query->execute();
}
Beispiel Logische Verknüpfungen
Public Function findForMyView ( $var1, $var2 ) {
$query = $this->createQuery();
Return $query
->matching(
$query->logicalAnd(
$query->equals('field1', $var1 ),
$query->lessThan('field2', $var ),
$query->greaterThan('field3', '1')
)
)
->setOrderings(Array('uid' => Tx_Extbase_Persistence_Query::ORDER_DESCENDING))
-> setLimit (1)
-> execute();
}
Beispiel: Kommaseparierte Liste für Abfrage
http://www.buero-sonne.de/2014/10/16/mysql-orderby-field-in-extbase.html
/**
* Find by multiple uids using, seperated string and maintain the list order
*
*/
public function findByUidListOrderByList($uidList) {
$uidArray = explode(",", $uidList);
$query = $this->createQuery();
$query->matching(
$query->in('uid', $uidArray),
$query->logicalAnd(
$query->equals('hidden', 0),
$query->equals('deleted', 0)
)
);
$query->setOrderings($this->orderByField('uid', $uidArray));
return $query->execute();
}
/**
* Set the order method
*
*/
protected function orderByField($field, $values) {
$orderings = array();
foreach ($values as $value) {
$orderings["$field={$value}"] = \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING;
}
return $orderings;
}