Zum Inhalt springen

UID eines soeben erstellen Datensatzes ermitteln.

Erstellt am 14. August 2009 · 11 Antworten · letzte Antwort am 24. November 2011

Tags: Datenbank, Frage

greenbanana ·

Hallo Community,

Ich stehe bei der Entwicklung eines Ticketsystems mit extbase und fluid auf dem Schlauch. Folgenden vereinfachten Ablauf habe ich:

User Registration --> Ticket erstellen --> Absenden

Nach der Registration, welches lediglich einen neuen Datensatz vom Typ ticket_user in der DB anlegt, möchte ich auf die Seite für die Ticket-Erstellung weiterleiten. In der Weiterleitung soll dann die UID des soeben erstellten Users übergeben werden.

So in der Art (nur als Beispiel):
/index.php?ticket[controller]=ticket&ticket[action]=new&ticketuser=76

Wie löse ich das am besten?

Die Action sieht im Moment so aus:

/**
* Creates a new ticketuser
*
* @param Tx_KiddogTicket_Domain_Model_Ticketuser $newTicketuser 
* A fresh Ticketuser object which has not yet been added to the repository
* @return void
*/
public function createAction(Tx_KiddogTicket_Domain_Model_Ticketuser $newTicketuser) {
$this->ticketuserRepository->add($newTicketuser);

// TODO: Die UID des Ticketusers muss dem Ticket-Controller übergeben werden. 
// Die nachfolgende Anweisung funktioniert lediglich statisch.		

$this->redirect('new', 'Ticket', NULL, array('ticket_user' => 76));
}

Gruss

greenbanana ·

Hallo just2b,

Vielen Dank für deine Antwort. Ich habe das jetzt folgendermasse integriert:

$this->redirect('new', 'Ticket', NULL, array('ticketUserUid' => $GLOBALS['TYPO3_DB']->sql_insert_id()));

In der URL wird dann zwar eine Zahl übergebe mit:
index.php?id=63&tx_kiddogticket_pi1[ticketUserUid]=104&tx_kiddogticket_pi1[action]=new&tx_kiddogticket_pi1[controller]=Ticket

Es ist aber NICHT die UID des soeben erstellten Ticketusers?! Merkwürdig...

greenbanana ·

Sollte ja eigentlich auch gehen. Es wird ja auch lediglich ein neuer Eintrag in der Tabelle 'tx_kiddogticket_domain_model_ticketuser' erstellt. Und mit $GLOBALS['TYPO3_DB']->sql_insert_id() sollte mir ja der letzte Eintrag zurück gegeben werden.

Danke trotzdem. Werde weiter suchen, und falls du noch eine Idee hast bin ich ganz Ohr...

Gruss

BlackPixel ·

Was steht denn in der insert_id, immer die gleiche Zahl oder zählt das hoch?

Führst Du noch eine andere Insert aus? Kannst Du mal schauen, was 104 für ein Datensatz ist? Irgendwoher muss die Zahl ja kommen...

greenbanana ·

Hallo BlackPixel

die id welche mit $GLOBALS['TYPO3_DB']->sql_insert_id() ausgegeben wird zählt mit grossen Schriite hoch. 10-15.

Ich habe die DB bereits nach Einträgen mit solch hohen ID's durchsucht aber leider auch nichts gefunden. Ich habe das Gefühl, dass es sich bei diesen Zaheln NICHT um Einträge aus de DB handelt (ich weiss das klingt sehr komisch...)

greenbanana ·

Folgenden Stand habe ich im Moment:

	/**
	 * Creates a new ticketuser
	 *
	 * @param Tx_KiddogTicket_Domain_Model_Ticketuser $newTicketuser
	 * @param Tx_KiddogTicket_Domain_Model_Ticketuser $ticketuser
	 * @return void
	 */
	public function createAction(Tx_KiddogTicket_Domain_Model_Ticketuser $newTicketuser) {
		$this->ticketuserRepository->add($newTicketuser);
		$ticketuser = $this->ticketuserRepository->findLatestEntry();
		$this->redirect('new', 'Ticket', NULL, array('ticketuser' => $ticketuser));
	}

Mit der Funktion findLatestEntry() in der Repository-Klasse wollte ich ein workaround bauen für die in extbase nicht funktionierende Funktion $GLOBALS['TYPO3_DB']->sql_insert_id().

Diese sieht folgendermasse aus:

	/**
	 * @return string ticketuser
	 */
	public function findLatestEntry() {
		$query = $this->createQuery();
		return $query
				->setOrderings(array('uid' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING))
				->setLimit(1)
				->execute();
	}

Das Resultat ist folgende URL:
http://localhost/index.php?id=63&tx_kiddogticket_pi1[ticketuser][0][uid]=34

Das ist aber leider nur FAST richtig #paralyzed# Erstens handelt es sich dabei nicht um den letzten Eintrag, sondern um den Vorletzten. Ich vermute also, dass der Eintrag noch gar nicht in der DB steht wenn die Funktion aufgerufen wird. und der zweite Schönheitsfehler ist die URL ich bräuchte nur einen String und kein Array. Also nur tx_kiddogticket_pi1[ticketuser][uid]=34.

Evt. jemand noch mit einer Idee?

greenbanana ·

NACHTRAG

Das Problem mit dem Array habe ich jetzt so gelöst:

	/**
	 * @return string ticketuser
	 */
	public function findLatestEntry() {
		$query = $this->createQuery();
		$ticketuserArray = $query
				->setOrderings(array('uid' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING))
				->setLimit(1)
				->execute();
		return $ticketuserArray[0];
	}
greenbanana ·

Leider bin ich noch immer nicht weiter gekommen.

So wie ich die Klasse Tx_Extbase_Persistence_Storage_Typo3DbBackend verstehe (svn.typo3.org/TYPO3v4/CoreProjects/MVC/extbase/branches/persistence_rewrite/Classes/Persistence/Storage/Typo3DbBackend.php), welche nach meiner Ansicht für den Eintrag in das jeweilige Repository verantwortlich ist, sollte ich die UID folgendermasse erhalten:

public function createAction(Tx_KiddogTicket_Domain_Model_Ticketuser $newTicketuser) {
$uid = $this->ticketuserRepository->add($newTicketuser);
}

Leider bleibt $uid aber leer. Kann mir da niemand helfen? Wäre sehr dankbar.

t1ggr ·

laut sourcen liefert add() nicht die id wieder. Ausserdem wird der Eintrag nicht sofort abgespeichert. Dies kannst du aber mit

$persistenceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');
$persistenceManager->persistAll();

allerdings triggern. erst danach kommst du an die benoetigte Uid.

schmidtpublic ·

Auch wenn das hier schon uralt ist, es wird ja als erstes gefunden - und da die Lösung schon fast gegeben ist, hier noch zur Vollständigkeit:

Man kann sich, wenn wie hier beschrieben persistiert wurde direkt auf das Objekt zugreifen und hat dann auch schon die neue uid:

$this->providerRepository->add($newProvider);
$persistenceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager');
$persistenceManager->persistAll();
        
$uid = $newProvider->getUid());

Oder eben den $newProvider als Objekt weiterreichen.

Das dürfte auch viel sicherer sein - denn die GLOBALS->...-Lösung wird bei zahlreichen SQL-Zugriffen nicht zuverlässig finden was wir suchen. Du hattest das Problem ja auch offenbar schon.

Viele Grüße vom Rhein, Stefan