LEFT JOIN & DELETE

Hi,

ich versuche grad einen LEFT JOIN auszuführen und die Ergebnisse dann zu löschen

Das SQL - Statement das mir "Leichen" in der Tabelle findet lautet:




SELECT * FROM entry

LEFT JOIN entry_solution ON (entry.id  = entry_solution.entryId )

WHERE entryId IS NULL



Meine relations()




	'lentry'	=> array(self::MANY_MANY, 'solution', 'entry_solution(entryId, solutionId)',

		'joinType'	=> 'LEFT JOIN',

	),



Meine "Problem" - Methode(n)

  1. Kandidat - führt nicht gewünschtest Ergebnis, weil ich die Bedingung IS NULL nicht hinzugefügt habe



public function deleteEntry()

{

	$x = Entry::model()->with('lentry')->findAll( );

	echo "<pre>";

	print_r($x);

	echo "</pre>";

}



  1. Kandidat - Führt keine LEFT JOIN aus + meckert über nicht bekannten Spaltennamen entryId

SELECT COUNT(*) FROM `entry_solutions` WHERE entryId=2




public function deleteEntry()

{

	$oCriteria = new CDbCriteria();

	$oCriteria->condition = "entryId IS NULL";

	$x = Entry::model()->with('lentry')->findAll( );

	echo "<pre>";

	print_r($x);

	echo "</pre>";

}



  1. Kandidat - FATAL ERROR (Löschen alle Einträge vom LEFT JOIN

Fatal error: Call to a member function deleteAll() on a non-object in E:\Workspace\blog2\protected\models\entry.php on line 133




public function deleteEntry()

{

	$x = Entry::model()->with('lentry')->findAll( );

	$x->deleteAll;

}



  1. Kandidat - meckert über Methode deleteAll

CActiveFinder hat keine Methode namens "deleteAll".


$x = Entry::model()->with('lentry')->deleteAll();

5.6 Kandidat wären deleteAll + condition, aber da 3 und 4 nicht funktionieren, habe ich die nun außer Acht gelassen.

Wer kennt den Trick?

thx!!

Bei 2.: Probier mal, den Tabellennamen noch mit anzugeben: [b]entry_solutions.entryId IS NULL

[/b]

bringt alles nichts, naja

habe nun die findAllBySql - Methode verwendet.

Aber ich kann die Datensätze nicht löschen


x = XXXX::model()->findAllBySql('....');

x->delete();

Fatal error: Call to a member function deleteAll() on a non-object in E:\Workspace\blog2\protected\models\xxxx.php on line 133

Alle findAll*() Methoden liefern Arrays aus AR Objekten zurück. Klar, dass ein Array kein delete() kennt. Du könntest also über das Array loopen und bei jedem Eintrag delete() ausführen. Find ich aber nicht sehr schön (braucht eine Abfrage pro Löschung).

Ich glaub, ich würd das in dem Fall über 2 SQL-Statements direkt mit DAO lösen und das ganze in eine Methode packen. AR ist nicht für alle Spezialfälle unbedingt perfekt geeignet.

Ergänzung:

Am einfachsten ist wohl, sich mit DAO erst die zu löschenden IDs in ein Array zu holen, und das dann an CActiveRecord::deleteByPk() zu übergeben.

Ja den Punkt habe ich in der Doku überlesen

findAllBySql() method

{return} array the records found. An empty array is returned if none is found.

findByAttributes() method

{return} CActiveRecord the record found. Null if none is found.

thx

hast du es mal für methode ein mit einem Alias versucht? Vielleicht so: ??.entryId

Aber da du ja alle Einträge löschen willst, die keine Lösung haben, würde ich das einfach in ein SQL Statement packen und das über die CDbConnection ausführen. MIt den Objekten willst du ja eh nicht weiter arbeiten daher macht es wenig Sinn, sie erst in PHP zu holen und dann wieder rauszuschmeissen.