Relations MANY_MANY

Hallo ZUsammen,

ich habe mir die letzten zwei Tage mit Doku und Google um die Ohren geschlagen um heraus zu finden was ich falsch mache. Leider ohne Erfolg.

Mein Problem:

Ich möchte zwei Tabellen über eine Many_Many Relation miteinander verbinden. Dazu habe ich die folgenden drei Tabellen angelegt:

Ausschnitt Tabelle mitglieder:




CREATE TABLE IF NOT EXISTS `mitglieder` (

  `id` varchar(150) COLLATE utf8_bin NOT NULL,

  `last_edit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  `starttime` date NOT NULL,

  `endtime` date NOT NULL,

  `disable` tinyint(4) unsigned NOT NULL DEFAULT '0',

  ...,

  PRIMARY KEY (`id`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



Ausschnitt Tabelle mitglieder_lizenzen:




CREATE TABLE IF NOT EXISTS `mitglieder_lizenzen` (

  `mitglieder_id` varchar(150) COLLATE utf8_bin NOT NULL,

  `lizenzen_id` int(10) NOT NULL,

  PRIMARY KEY (`mitglieder_id`,`lizenzen_id`),

  KEY `lizenzen_id` (`lizenzen_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



Ausschnitt Tabelle lizenzen:




CREATE TABLE IF NOT EXISTS `lizenzen` (

  `id` int(10) NOT NULL AUTO_INCREMENT,

  `last_edit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  ...

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;



Im Mitglieder Model steht unter Relation:




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

		    'lizenzen'=>array(self::MANY_MANY, 'Lizenzen', 

                                'mitglieder_lizenzen(mitglieder_id, lizenzen_id)',

                                'together' => true),

        );

}



Und bei dem Lizenzen Model:




public function relations()

{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

	return array(

           'mitglieder'=>array(self::MANY_MANY, 'Mitglieder', 

                   'mitglieder_lizenzen(mitglieder_id,lizenzen_id)'),

        );

}



Wenn ich nun dies in einer View über folgenden Code aufrufe:


<?php

$this->renderPartial('_mitgliederlizenzen',array(

            'mitglieder'=>$model,

            'lizenz'=>$model->lizenzen,

        ), true);

		

?>

wird folgendes Query erzeugt:


Querying SQL: SELECT `t`.`id` AS `t0_c0`, `t`.`last_edit` AS `t0_c1`,

`lizenzen`.`id` AS `t1_c0`,

`lizenzen`.`last_edit` AS `t1_c1`, `lizenzen`.`name` AS `t1_c6`,

`lizenzen`.`sort` AS `t1_c7` FROM `mitglieder` `t`  LEFT OUTER JOIN

`mitglieder_lizenzen` `lizenzen_lizenzen` ON

(`t`.`id`=`lizenzen_lizenzen`.`mitglieder_id`) LEFT OUTER JOIN `lizenzen`

`lizenzen` ON (`lizenzen`.`id`=`lizenzen_lizenzen`.`lizenzen_id`)  WHERE

(`t`.`id`='FSG-MG-3e5c8abd-2d55-6b68-eaf9-0000425c2663')

Wenn ich mir die das Query anschaue stelle ich fest, dass er mir lizenzen_lizenzen zusammen bastelt aber leider nicht mitglieder_lizenzen. Hier läuft irgendwas falsch. Er verdoppelt einfach den gewählten Namen aus dem Model

Was mache ich Falsch?

Vielen Dank für euere Hilfe.

Gruß nz-duck

Ich glaube du musst die Felder mitglieder_id und lizenzen_id im Mitglieder Model vertauschen, also




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

    		'lizenzen'=>array(self::MANY_MANY, 'Lizenzen', 

                                'mitglieder_lizenzen(lizenzen_id, mitglieder_id)',

                                'together' => true),

        );

}



Danke für die Antwort, aber leider hat es nichts geändert.

Ich kann es auch nicht ganz nachvollziehen.

Wenn ich den Namen der Relation ändere von lizenzen nach lizenzens, dann ändert sich die Query wie folgt:

von




...

FROM `mitglieder` `t`  LEFT OUTER JOIN

`mitglieder_lizenzen` `lizenzen_lizenzen` ON

(`t`.`id`=`lizenzen_lizenzen`.`mitglieder_id`)

...



nach




...

FROM `mitglieder` `t`  LEFT OUTER JOIN

`mitglieder_lizenzen` `lizenzens_lizenzens` ON

(`t`.`id`=`lizenzens_lizenzens`.`mitglieder_id`)

...



irgendwie ist das komisch…