Diverse Probleme mit Daten bei HABTM

39 views
Skip to first unread message

gerrit...@gmail.com

unread,
Mar 1, 2013, 6:56:20 AM3/1/13
to cakep...@googlegroups.com
Hallo Leute,

ich habe vor kurzem mit CakePHP angefangen und bin momentan dabei ein kleines WebProjekt zu entwickeln. Dabei habe ich jetzt allerdings ein paar Probleme mit dem Speichern/Löschen von Daten bei einer HABTM Beziehung.

a) Wenn ich ein Projekt lösche werden alle Beziehungen zu Usern gelöscht, die in diesem Projekt aktiv waren, auch die, die nichts mit dem gelöschten Projekt zu tun haben.
Bsp. Projekt "Braunschweig" hat die Benutzer "dennis" und "ingo". "ingo" ist weiterhin in dem Projekt "develop-first" aktiv. Wenn ich nun das Projekt "Braunschweig" lösche werden einerseits die Beziehungen zu diesem Projekt gelöscht, so wie gewollt. Andererseits wird aber ingo auch aus dem Projekt "develop-first" entfernt.

Beziehung
public $hasAndBelongsToMany = array(
     'User' => array(
        'className' => 'User',
        'order' => 'User.username ASC',
        'joinTable' => 'users_projects',
        'foreignKey' => 'project_id',
        'associationForeignKey' => 'user_id'));

Löschen-Methode
if($this->Project->delete($id)) {
    $this->Session->setFlash(__('Projekt gelöscht.'));
    $this->redirect(array('action' => 'projectlist'));
}

$this->Session->setFlash(__('Projekt konnte nicht gelöscht werden.'));
$this->redirect(array('action' => 'projectlist'));

b) Wenn ich nur eine Beziehung löschen will aber ein Projekt / Benutzer behalten will habe ich momentan einen manuellen SQL-Query in Benutzung. Bietet CakePHP dort eine einfache Möglichkeit? Bei mir wurden immer Benutzer und/oder Projekt mitgelöscht.

Vielen dank im Voraus!

Gruß
gerritkpunkt

Mark Kessler

unread,
Mar 1, 2013, 7:46:30 AM3/1/13
to cakep...@googlegroups.com
Hallo,

zu deinen Fragen:

a) Also irgend etwas muss mit deinem Setup nicht stimmen. Mir is nur eine Sache aufgefallen: Deine Join Tabelle müsste eigentlich "projects_uses" heissen (alphabetische Reihenfolge). Das kann man zwar überschreiben so wie du das gemacht hast aber man sollte sich möglichst an die Konventionen halten solange es keinen guten Grund gibt der dagegen spricht (was selten der Fall ist). Stichwort: "Convetion over Configuration". Das sollte aber eigentlich nicht das Problem sein.
Kannst du noch einmal deine kompletten Setup der Assoziationen posten? vom Project und User Model? Und auch einen SQL Dump der Struktur der projects und users Tabelle?
b) Gibt es meines Wissens nicht. Es wird normalerweise so gelöst dass Alle Assoziationen gelöscht und dann nur die noch existierenden neu erstellt werden. Schau dir mal an wie das in Views und Controllers gemacht wird die von Cake über den "bake" Befehl erstellt werden. Direkte SQL Queries sind immer eine schlechte Idee.

Gruß,
Mark

--
--
Bitte bei Fragen immer auch die aktuell verwendete cakePHP Version angeben und
wenn möglich auch das verwendete Betriebssystem und die PHP Version. Danke.
Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google Groups-Gruppe "CakePHP-de für deutsche CakePHP Entwickler".
Für das Erstellen von Beiträgen in dieser Gruppe senden Sie eine E-Mail
an cakep...@googlegroups.com
Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an cakephp-de-...@googlegroups.com
Weitere Optionen finden Sie in dieser Gruppe unter http://groups.google.com/group/cakephp-de?hl=de
---
Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe CakePHP-de für deutsche CakePHP Entwickler beigetreten sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an cakephp-de+...@googlegroups.com.
Weitere Optionen: https://groups.google.com/groups/opt_out
 
 

Mathias Ratheike

unread,
Mar 1, 2013, 8:31:33 AM3/1/13
to cakep...@googlegroups.com
Hi

Ich würde auch sagen dass du die Verknüpfungen falsch gesetzt hast. Den Join würde ich da gar nicht setzen:

Users hasMany usersToProjects
Projects hasMany UsersToProjects
UsersToProjects belongsTo Users, Projects

So würde ich das über 3 Tabellen lösen.

Gruß
M

- mobil gesendet -

Mark Kessler

unread,
Mar 1, 2013, 8:44:17 AM3/1/13
to cakep...@googlegroups.com
@Mathias' Das wäre dann eine "Has Many Through" Beziehung. Kann man auch machen, ist in Vielerlei Hinsicht praktischer aber auch nicht unbedingt nötig.
Gruß,
Mark

2013/3/1 Mathias Ratheike <mat...@mrnetworks.de>

gerritkpunkt

unread,
Mar 2, 2013, 4:35:03 AM3/2/13
to cakep...@googlegroups.com
Vielen dank euch!

Mithilfe von Mathias' Tipp konnte ich alle Probleme beseitigen zudem ermöglicht es mir Informationen über die Mitgliedschaft zu speichern (Rolle, Seit wann etc.)

Nochmals danke!

Gruß,
Gerrit K.

gerritkpunkt

unread,
Mar 2, 2013, 8:32:05 AM3/2/13
to cakep...@googlegroups.com
Ich habe nun nurnoch ein kleines Problem. Wenn ich deleteAll() ausführe mit dependent=true in den Beziehungen versucht er ein SELECT auf die id eines Objekts auszuführen. Kann ich das auch ändern oder brauch dann meine Beziehungstabelle eine AutoIncrement id?

Gruß
Gerrit K.

Mathias Ratheike

unread,
Mar 2, 2013, 10:21:04 AM3/2/13
to cakep...@googlegroups.com
Hi,

Bei cake sollte jede Tabelle eine AutoIncrement ID haben. Das macht das arbeiten mit allen Tabellen um so vieles einfacher.

Gruß
M.

- mobil gesendet -

Anja Liebermann

unread,
Mar 2, 2013, 9:22:11 AM3/2/13
to cakep...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Gerrit,


ein autoincrement auf die id zu setzen ist prinzipiell keien schlechte
Idee. Ich habe meist Probleme, wenn ich es vergesse.

Calamity Jane


Am 02.03.2013 14:32, schrieb gerritkpunkt:
> Ich habe nun nurnoch ein kleines Problem. Wenn ich deleteAll() ausf�hre mit
> dependent=true in den Beziehungen versucht er ein SELECT auf die id eines
> Objekts auszuf�hren. Kann ich das auch �ndern oder brauch dann meine
> Beziehungstabelle eine AutoIncrement id?
>
> Gru�
> Gerrit K.
>
> Am Samstag, 2. M�rz 2013 10:35:03 UTC+1 schrieb gerritkpunkt:
>>
>> Vielen dank euch!
>>
>> Mithilfe von Mathias' Tipp konnte ich alle Probleme beseitigen zudem
>> erm�glicht es mir Informationen �ber die Mitgliedschaft zu speichern
>> (Rolle, Seit wann etc.)
>>
>> Nochmals danke!
>>
>> Gru�,
>> Gerrit K.
>>
>> Am Freitag, 1. M�rz 2013 14:44:17 UTC+1 schrieb tinytiger:
>>>
>>> @Mathias' Das w�re dann eine "Has Many Through" Beziehung. Kann man auch
>>> machen, ist in Vielerlei Hinsicht praktischer aber auch nicht unbedingt
>>> n�tig.
>>> Gru�,
>>> Mark
>>>
>>> 2013/3/1 Mathias Ratheike <mat...@mrnetworks.de>
>>>
>>>> Hi
>>>>
>>>> Ich w�rde auch sagen dass du die Verkn�pfungen falsch gesetzt hast. Den
>>>> Join w�rde ich da gar nicht setzen:
>>>>
>>>> Users hasMany usersToProjects
>>>> Projects hasMany UsersToProjects
>>>> UsersToProjects belongsTo Users, Projects
>>>>
>>>> So w�rde ich das �ber 3 Tabellen l�sen.
>>>>
>>>> Gru�
>>>> M
>>>>
>>>> - mobil gesendet -
>>>>
>>>> Am 01.03.2013 um 13:46 schrieb Mark Kessler <kessle...@gmail.com>:
>>>>
>>>> Hallo,
>>>>
>>>> zu deinen Fragen:
>>>>
>>>> a) Also irgend etwas muss mit deinem Setup nicht stimmen. Mir is nur
>>>> eine Sache aufgefallen: Deine Join Tabelle m�sste eigentlich
>>>> "projects_uses" heissen (alphabetische Reihenfolge). Das kann man zwar
>>>> �berschreiben so wie du das gemacht hast aber man sollte sich m�glichst an
>>>> die Konventionen halten solange es keinen guten Grund gibt der dagegen
>>>> spricht (was selten der Fall ist). Stichwort: "Convetion over
>>>> Configuration". Das sollte aber eigentlich nicht das Problem sein.
>>>> Kannst du noch einmal deine kompletten Setup der Assoziationen posten?
>>>> vom Project und User Model? Und auch einen SQL Dump der Struktur der
>>>> projects und users Tabelle?
>>>> b) Gibt es meines Wissens nicht. Es wird normalerweise so gel�st dass
>>>> Alle Assoziationen gel�scht und dann nur die noch existierenden neu
>>>> erstellt werden. Schau dir mal an wie das in Views und Controllers gemacht
>>>> wird die von Cake �ber den "bake" Befehl erstellt werden. Direkte SQL
>>>> Queries sind immer eine schlechte Idee.
>>>>
>>>> Gru�,
>>>> Mark
>>>>
>>>> 2013/3/1 <gerrit...@gmail.com>
>>>>
>>>>> Hallo Leute,
>>>>>
>>>>> ich habe vor kurzem mit CakePHP angefangen und bin momentan dabei ein
>>>>> kleines WebProjekt zu entwickeln. Dabei habe ich jetzt allerdings ein paar
>>>>> Probleme mit dem Speichern/L�schen von Daten bei einer HABTM Beziehung.
>>>>>
>>>>> a) Wenn ich ein Projekt l�sche werden alle Beziehungen zu Usern
>>>>> gel�scht, die in diesem Projekt aktiv waren, auch die, die nichts mit dem
>>>>> gel�schten Projekt zu tun haben.
>>>>> Bsp. Projekt "Braunschweig" hat die Benutzer "dennis" und "ingo".
>>>>> "ingo" ist weiterhin in dem Projekt "develop-first" aktiv. Wenn ich nun das
>>>>> Projekt "Braunschweig" l�sche werden einerseits die Beziehungen zu diesem
>>>>> Projekt gel�scht, so wie gewollt. Andererseits wird aber ingo auch aus dem
>>>>> Projekt "develop-first" entfernt.
>>>>>
>>>>> Beziehung
>>>>> public $hasAndBelongsToMany = array <http://www.php.net/array>(
>>>>> 'User' => array <http://www.php.net/array>(
>>>>> 'className' => 'User',
>>>>> 'order' => 'User.username ASC',
>>>>> 'joinTable' => 'users_projects',
>>>>> 'foreignKey' => 'project_id',
>>>>> 'associationForeignKey' => 'user_id'));
>>>>>
>>>>> L�schen-Methode
>>>>> if($this->Project->delete($id)) {
>>>>> $this->Session->setFlash(__('Projekt gel�scht.'));
>>>>> $this->redirect(array <http://www.php.net/array>('action' =>
>>>>> 'projectlist'));
>>>>> }
>>>>>
>>>>> $this->Session->setFlash(__('Projekt konnte nicht gel�scht werden.'));
>>>>> $this->redirect(array <http://www.php.net/array>('action' =>
>>>>> 'projectlist'));
>>>>>
>>>>> b) Wenn ich nur eine Beziehung l�schen will aber ein Projekt / Benutzer
>>>>> behalten will habe ich momentan einen manuellen SQL-Query in Benutzung.
>>>>> Bietet CakePHP dort eine einfache M�glichkeit? Bei mir wurden immer
>>>>> Benutzer und/oder Projekt mitgel�scht.
>>>>>
>>>>> Vielen dank im Voraus!
>>>>>
>>>>> Gru�
>>>>> gerritkpunkt
>>>>>
>>>>> --
>>>>> --
>>>>> Bitte bei Fragen immer auch die aktuell verwendete cakePHP Version
>>>>> angeben und
>>>>> wenn m�glich auch das verwendete Betriebssystem und die PHP Version.
>>>>> Danke.
>>>>> Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google
>>>>> Groups-Gruppe "CakePHP-de f�r deutsche CakePHP Entwickler".
>>>>> F�r das Erstellen von Beitr�gen in dieser Gruppe senden Sie eine E-Mail
>>>>> an cakep...@googlegroups.com
>>>>> Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an
>>>>> cakephp-de-...@googlegroups.com
>>>>> Weitere Optionen finden Sie in dieser Gruppe unter
>>>>> http://groups.google.com/group/cakephp-de?hl=de
>>>>> ---
>>>>> Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe
>>>>> CakePHP-de f�r deutsche CakePHP Entwickler beigetreten sind.
>>>>> Um Ihr Abonnement f�r diese Gruppe zu beenden und keine E-Mails mehr
>>>>> von dieser Gruppe zu erhalten, senden Sie eine Email an
>>>>> cakephp-de+...@googlegroups.com.
>>>>> Weitere Optionen: https://groups.google.com/groups/opt_out
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> --
>>>> Bitte bei Fragen immer auch die aktuell verwendete cakePHP Version
>>>> angeben und
>>>> wenn m�glich auch das verwendete Betriebssystem und die PHP Version.
>>>> Danke.
>>>> Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google
>>>> Groups-Gruppe "CakePHP-de f�r deutsche CakePHP Entwickler".
>>>> F�r das Erstellen von Beitr�gen in dieser Gruppe senden Sie eine E-Mail
>>>> an cakep...@googlegroups.com
>>>> Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an
>>>> cakephp-de-...@googlegroups.com
>>>> Weitere Optionen finden Sie in dieser Gruppe unter
>>>> http://groups.google.com/group/cakephp-de?hl=de
>>>> ---
>>>> Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe
>>>> CakePHP-de f�r deutsche CakePHP Entwickler beigetreten sind.
>>>> Um Ihr Abonnement f�r diese Gruppe zu beenden und keine E-Mails mehr von
>>>> dieser Gruppe zu erhalten, senden Sie eine Email an
>>>> cakephp-de+...@googlegroups.com.
>>>> Weitere Optionen: https://groups.google.com/groups/opt_out
>>>>
>>>>
>>>>
>>>> --
>>>> --
>>>> Bitte bei Fragen immer auch die aktuell verwendete cakePHP Version
>>>> angeben und
>>>> wenn m�glich auch das verwendete Betriebssystem und die PHP Version.
>>>> Danke.
>>>> Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google
>>>> Groups-Gruppe "CakePHP-de f�r deutsche CakePHP Entwickler".
>>>> F�r das Erstellen von Beitr�gen in dieser Gruppe senden Sie eine E-Mail
>>>> an cakep...@googlegroups.com
>>>> Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an
>>>> cakephp-de-...@googlegroups.com
>>>> Weitere Optionen finden Sie in dieser Gruppe unter
>>>> http://groups.google.com/group/cakephp-de?hl=de
>>>> ---
>>>> Sie haben diese Nachricht erhalten, weil Sie der Google Groups-Gruppe
>>>> CakePHP-de f�r deutsche CakePHP Entwickler beigetreten sind.
>>>> Um Ihr Abonnement f�r diese Gruppe zu beenden und keine E-Mails mehr von
>>>> dieser Gruppe zu erhalten, senden Sie eine Email an
>>>> cakephp-de+...@googlegroups.com.
>>>> Weitere Optionen: https://groups.google.com/groups/opt_out
>>>>
>>>>
>>>>
>>>
>>>
>

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEARECAAYFAlEyCxMACgkQbOdiIJzHNKG2ZQCgovHUHKEM6ZqtWY4OYgg87Zk3
dKIAn3n80r7+QJmBr10bT0I6PHyn/jrd
=eSWe
-----END PGP SIGNATURE-----
Reply all
Reply to author
Forward
0 new messages