Zum Inhalt springen

1:n Beziehung add: Call to a member function attach() on a non-object

Erstellt am 6. Mai 2012 · 2 Antworten · letzte Antwort am 22. Oktober 2014

Tags: PHP, Frage

rleuthold ·

Hallo zusammen,

Meine Models Unit und Reservations haben eine 1:n Beziehung (unit->reservations).

Nun übergebe ich der create Action methode im ReservationController eine unit und eine neue Reservation und möchte diese mittels

$unit->addReservation($newReservation);

der Unit zuweisen.

Dabei erhalte ich folgenden Error:

Fatal error: Call to a member function attach() on a non-object

Im Unit Model wird die Relation wie folgt verwaltet:

/**
 * __construct
 *
 * @return void
 */
public function __construct() {
	//Do not remove the next line: It would break the functionality
	$this->initStorageObjects();
}

/**
 * Initializes all Tx_Extbase_Persistence_ObjectStorage properties.
 *
 * @return void
 */
protected function initStorageObjects() {
	$this->reservations = new Tx_Extbase_Persistence_ObjectStorage();
}

/**
 * Adds a Reservation
 *
 * @param Tx_AboUnitReservation_Domain_Model_Reservation $reservation
 * @return void
 */
public function addReservation(Tx_AboUnitReservation_Domain_Model_Reservation $reservation) {	
	$this->reservations->attach($reservation);
}

Wenn ich nun die addReservation methode wie folgt ergänze:

public function addReservation(Tx_AboUnitReservation_Domain_Model_Reservation $reservation) {
		
	if($this->reservations == null) {
		$this->reservations = new Tx_Extbase_Persistence_ObjectStorage();
	}
		
	$this->reservations->attach($reservation);
}

Funktioniert es - aber ich verstehe nicht warum es mit dem ursprünglichen Code nicht funktioniert.

Wenn ich einen Breakpoint in der initStorageObjects() setze, kann ich sehen, dass die Methode vor dem Aufruf der create action ausgeführt wird.

Hat jemand eine Idee, warum das mit dem ursprünglichen Code trotzdem nicht funktioniert?

Grüsse & Danke
Rico

conic ·

Hast du mittlerweile rausgefunden woran es lag?
Ich habe heute denselben Fehler gehabt und nur mit deinem Fix lösen können, aber schön ist das natürlich nicht!
Würde mich sehr über eine Antwort freuen, auch wenn's schon ein Jahr her ist...

Aimo

Opresse ·

So auch wenn es wieder ein Jahr später ist, ich habe eine Lösung für das Problem gefunden und hoffe dass es anderen weiterhelfen kann:

Bei mir war das Problem dass mein Feld in der TCA + SQL Table einen anderen Namen hatte als
im Model.

Bedeutet in dem Beispiel oben "reservations" muss genau so in der TCA als auch als Datenbankfeld existieren. Oder man muss das Mapping anpassen.