Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie obiektów
Forum PHP.pl > Forum > PHP > Object-oriented programming
bodzio_sosna
Witam,
mam klase Color w jednym z składników jest obiekt klasy Image
  1. class Color {
  2. private $Id;
  3. private $Color;
  4. private $Image = array(); //obiekt klasy Image
  5. ...
  6. }
  7.  
  8. class Image
  9. {
  10. private $Id;
  11. private $Title;
  12. private $Description;
  13. private $File;
  14. ...
  15. }

tabele w bazie:
Color
color_id | color_name

Image
image_id | image_title | image_files | image_description

img_for_color
imageId | colorId

color_for_product
colorId | productId

W bazie znajdują się jeszcze inne tab np. product, img_for_product itd.

Mój problem dotyczy usuwania obiektów, mianowicie czy podczas usuwania obiektu 'color' do którego są przypisane obiekty 'image' usuwać:
1. Tylko obiekt color (Delete FROM color WHERE color_id = xxx);
2. Obiekt color i wszystkie przypisane do niego zdjęcia (DELETE FROM color AS col LEFT OUTER JOIN img_for_color AS ifc ON col.color_id = ifc.colorId LEFT OUTER JOIN images AS img ON ifc.imagesId = img.image_id WHERE col.color_id = xxx)

P.S - usuwać rekordy z tab. color_for_product czy to podczas usuwania obiektu typu 'product',
- w przypadku usuwania również obiektów image usuwać powiązane z nimi zdjęcia, a może najpierw sprawdzać czy owe zdjęcia nie są przypisane jeszcze do innych obiektów??

Będę wdzięczny za opinie
Zyx
Utożsamianie usuwania obiektu z usuwaniem wiersza w bazie to nieporozumienie i stanowczo odradzam Ci robienie takiego powiązania. Inaczej żadne dane w bazie nie przetrwają końca pracy skryptu smile.gif. Usuwanie powinieneś realizować poprzez jawne żądanie "odpięcia" obiektu od wiersza w bazie:

Kod
$entityManager->delete($object);
bodzio_sosna
Może inaczej,
poza wspomnianymi klasami color image mam jeszcze ColorMenager i ImageMenager itd.
  1. class ColorMenager implements IMenager
  2. {
  3. ...
  4. public function delete($id)
  5. {
  6. //*del all from table color, images, img_for_color, color_for_product
  7. //$count = $this->dbh->exec('DELETE col.*, img.*, ifc.*, cfp.* FROM color AS col LEFT OUTER JOIN img_for_color AS ifc ON col.color_id = ifc.colorId LEFT OUTER JOIN images AS img ON ifc.imagesId = img.image_id LEFT OUTER JOIN color_for_product AS cfp ON cfp.colorId = col.color_id WHERE col.color_id = '.$id);
  8. //*del all from table color, img_for_color, color_for_product
  9. //$count = $this->dbh->exec('DELETE col.*, ifc.*, cfp.* FROM color AS col LEFT OUTER JOIN img_for_color AS ifc ON col.color_id = ifc.colorId LEFT OUTER JOIN color_for_product AS cfp ON cfp.colorId = col.color_id WHERE col.color_id = '.$id);
  10. //del all from table color, img_for_color
  11. $count = $this->dbh->exec('DELETE col.*, ifc.* FROM color AS col LEFT OUTER JOIN img_for_color AS ifc ON col.color_id = ifc.colorId WHERE col.color_id = '.$id);
  12. return $count;
  13. }
  14.  
  15. public function getAllAssignedTo($object, $idObject)
  16. {
  17. $object = strtolower($object);
  18. $color_for_object = 'color_for_'.$object;
  19. $column = 'cfo.'.$object.'Id';
  20. $result = $this->dbh->prepare('SELECT col.color_id, col.color_name FROM color AS col LEFT OUTER JOIN '.$color_for_object.' AS cfo ON col.color_id = cfo.colorId WHERE '.$column.' = :id');
  21. $result -> setFetchMode(PDO::FETCH_ASSOC);
  22. $result -> bindValue(':id', $idObject, PDO::PARAM_INT);
  23. $result -> execute();
  24. if($result->rowCount() != 0) {
  25. $color = array();
  26. foreach($result as $key=>$row)
  27. {
  28. if(!isset($row['color_id']) || $row['color_id'] == 0)return false;
  29. else
  30. {
  31. $color['color_id'] = $row['color_id'];
  32. isset($row['color_name']) ? $color['color_name'] = $row['color_name'] : $color['color_name'] = '';
  33.  
  34. $img_ob = new ImageMenager($this->dbh);
  35. $color['image'] = $img_ob->getAllAssignedTo('color', $color['color_id']);
  36. $col[] = new Color($color['color_id'], $color['color_name'], $color['image']);
  37. }
  38. }
  39. return $col;
  40. }
  41. else return false;
  42. }
  43. }

do których odwołuje się w następujący sposób
  1. $col_ob = new ColorMenager($this->dbh);
  2. $col_ob->getAllAssignedTo('product', $id);
  3. $col_ob->delete($id);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.