Yii Framework Forum: LEFT JOIN & DELETE - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

LEFT JOIN & DELETE Rate Topic: -----

#1 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 30 October 2009 - 11:34 AM

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>";
}



2. 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>";
}


3. 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;
}


4. 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!!
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#2 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 30 October 2009 - 02:58 PM

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


0

#3 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 30 October 2009 - 07:12 PM

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
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#4 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 31 October 2009 - 06:14 AM

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.

This post has been edited by Mike: 31 October 2009 - 06:19 AM

0

#5 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 31 October 2009 - 06:40 AM

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
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#6 User is offline   Dave 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 187
  • Joined: 09-October 08

Posted 03 November 2009 - 10:38 AM

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.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users