We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 34075 ☆ A M B ☆
    • 130 Posts
    I’m building a simple newsletter system, but since xPDO is new to me that’s not going very smooth smiley

    I have the following schema:

    <?xml version="1.0" encoding="UTF-8"?>
    <model package="newsletters" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" phpdoc-package="newsletters" phpdoc-subpackage="">
    
        <object class="Newsletter" table="newsletters" extends="xPDOSimpleObject">
            <field key="title" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
            <field key="document" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
        </object>
    	
        <object class="Subscriber" table="newsletters_subscribers" extends="xPDOSimpleObject">
    		<composite alias="GroupSubscribers" class="GroupSubscribers" local="id" foreign="group"  cardinality="many" owner="local" />
            <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
            <field key="email" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="code" dbtype="varchar" precision="32" phptype="string" null="false" default="" />
    		<field key="active" dbtype="int" precision="1" phptype="integer" null="false" default="0" />
        </object>
    	
        <object class="Group" table="newsletters_groups" extends="xPDOSimpleObject">
    		<composite alias="GroupSubscribers" class="GroupSubscribers" local="id" foreign="subscriber"  cardinality="many" owner="local" />
    		<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    	</object>
    	
    	<object class="GroupSubscribers" table="newsletters_groups_subscribers" extends="xPDOSimpleObject">
        	<field key="subscriber" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
        	<field key="group" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
    		<aggregate alias="Subscriber" class="Subscriber" local="subscriber" foreign="id" cardinality="one" owner="foreign" />
    		<aggregate alias="Group" class="Group" local="group" foreign="id" cardinality="one" owner="foreign" />
      	</object>
    	
    </model>
    


    The PHP code:

    <?php
    $modx->addPackage('newsletters', MODX_CORE_PATH.'/components/newsletters/assets/model/');  
    
    $group = $modx->newObject('Group');
    $group->set('name', 'Nog maar een groep');
    
    $subscribers = array();
    for ($i=1;$i<10;$i++) {  
        $subscriber = $modx->newObject('Subscriber');  
        $subscriber->set('name', 'Subscriber '.$i);
    	$subscriber->set('email', 'subscriber'.$i.'@email.tld');
        $subscribers[] = $subscribers;  
    }  
    
    $group->addMany($subscribers);
    $group->save();
    ?>
    


    The problem:
    The group is saved, but the subscribers are not. Can anybody help me out?
      Jeroen Kenters

      MODX Professional | MODX Ambassador | Dutch MODX forums moderator

      website | twitter
      • 22303 MODX Staff
      • 10,725 Posts
      $subscribers[] = $subscribers;
      huh You are assigning the entire array to a new element in the array on each loop.
        • 34075 ☆ A M B ☆
        • 130 Posts
        Oops. Coffee time smiley

        I changed it to:
        <?php
            $subscribers[] = $subscriber;
        ?>    
        


        Still no luck though. Group is saved, subscribers are not.
          Jeroen Kenters

          MODX Professional | MODX Ambassador | Dutch MODX forums moderator

          website | twitter
          • 34075 ☆ A M B ☆
          • 130 Posts
          We are getting somewhere here. By adding an alias to addMany, the subscribers get saved.

          <?php
          $group->addMany($subscribers, 'GroupSubscribers');
          ?>
          


          However, the ’newsletters_groups_subscribers’ table (linking groups and subscribers) remains empty. How to solve that?
            Jeroen Kenters

            MODX Professional | MODX Ambassador | Dutch MODX forums moderator

            website | twitter
            • 22303 MODX Staff
            • 10,725 Posts
            Seems like you are missing a relation to your intersection table for your many-to-many huh
              • 34075 ☆ A M B ☆
              • 130 Posts
              Thank you for you support so far. I still haven’t got a clue what’s wrong. Can anyone please help?

              The current schema:

              <?xml version="1.0" encoding="UTF-8"?>
              <model package="newsletters" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" phpdoc-package="newsletters" phpdoc-subpackage="">
              	
                  <object class="Subscriber" table="newsletters_subscribers" extends="xPDOSimpleObject">
              		<composite class="GroupSubscribers" local="id" foreign="subscriber"  cardinality="many" owner="local" />
                      	<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                      	<field key="email" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
              		<field key="code" dbtype="varchar" precision="32" phptype="string" null="false" default="" />
              		<field key="active" dbtype="int" precision="1" phptype="integer" null="false" default="0" />
                  </object>
              	
                  <object class="Group" table="newsletters_groups" extends="xPDOSimpleObject">
              		<composite class="GroupSubscribers" local="id" foreign="group"  cardinality="many" owner="local" />
              		<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                  </object>
              	
                  <object class="GroupSubscribers" table="newsletters_groups_subscribers" extends="xPDOSimpleObject">
                  		<field key="subscriber" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
                  		<field key="group" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
              		<aggregate class="Subscriber" local="subscriber" foreign="id" cardinality="one" owner="foreign" />
              		<aggregate class="Group" local="group" foreign="id" cardinality="one" owner="foreign" />
                  </object>
              	
              </model>
              


              The PHP code:
              <?php
              
              $group = $modx->newObject('Group');
              $group->set('name', 'Nog maar een groep');
              
              $subscribers = array();
              for ($i=1;$i<10;$i++) {  
                  $subscriber = $modx->newObject('Subscriber');  
                  $subscriber->set('name', 'Subscriber '.$i);
              	$subscriber->set('email', 'subscriber'.$i.'@email.tld');
              	$subscriber->set('code', 'code'.$i);
              	$subscriber->set('active', '0');
              	$subscribers[] = $subscriber;
              }  
              
              $group->addMany($subscribers);
              $group->save();
              ?>
              


              How to define the relationship so that the intersection table is also used?

              btw: the code above does not save de subscribers. I was able to fix that with an alias, but I guess that shoudn’t be necessary?
                Jeroen Kenters

                MODX Professional | MODX Ambassador | Dutch MODX forums moderator

                website | twitter
                • 34075 ☆ A M B ☆
                • 130 Posts
                Can someone please help me with this? I really need to get this fixed...
                  Jeroen Kenters

                  MODX Professional | MODX Ambassador | Dutch MODX forums moderator

                  website | twitter
                  • 34075 ☆ A M B ☆
                  • 130 Posts
                  With debugging on, I see this:



                  No foreign key definition for parentClass: Group using relation alias: Subscriber

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Returning ancestry for Group: Array
                  (
                  [0] => Group
                  [1] => xPDOSimpleObject
                  [2] => xPDOObject
                  )

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  No primary key value found for pk definition: id

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Returning ancestry for Group: Array
                  (
                  [0] => Group
                  [1] => xPDOSimpleObject
                  [2] => xPDOObject
                  )

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Returning validation rules: Array
                  (
                  )

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Validation called but no rules were found.

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Validator class executed, result = 1

                  [2010-08-04 09:56:21] (DEBUG @ /manager/index.php)

                  Executing SQL:
                  INSERT INTO `modx_newsletters_groups` (`name`) VALUES (:name)
                  with bindings:
                  Array
                  (
                  [:name] => Array
                  (
                  [value] => Nog maar een groep
                  [type] => 2
                  )

                  )



                  Somehow the relationship between the two is not working...
                    Jeroen Kenters

                    MODX Professional | MODX Ambassador | Dutch MODX forums moderator

                    website | twitter
                    • 34075 ☆ A M B ☆
                    • 130 Posts
                    I decided to try it the other way around (add groups to the subscriber).
                    
                    [b]Current schema:[/b]
                    
                    
                    <?xml version="1.0" encoding="UTF-8"?>
                    <model package="newsletters" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" phpdoc-package="newsletters" phpdoc-subpackage="">

                    <object class="nwNewsletter" table="newsletters" extends="xPDOSimpleObject">
                    <field key="title" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                    <field key="document" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
                    </object>

                    <object class="nwSubscriber" table="newsletters_subscribers" extends="xPDOSimpleObject">
                    <composite alias="Subscribers" class="nwGroupSubscribers" local="id" foreign="subscriber" cardinality="many" owner="local" />


                    <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                    <field key="email" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                    <field key="code" dbtype="varchar" precision="32" phptype="string" null="false" default="" />
                    <field key="active" dbtype="int" precision="1" phptype="integer" null="false" default="0" />
                    </object>

                    <object class="nwGroup" table="newsletters_groups" extends="xPDOSimpleObject">
                    <composite alias="Groups" class="nwGroupSubscribers" local="id" foreign="group" cardinality="many" owner="local" />

                    <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
                    </object>

                    <object class="nwGroupSubscribers" table="newsletters_groups_subscribers" extends="xPDOSimpleObject">
                    <aggregate alias="Subscriber" class="nwSubscriber" local="subscriber" foreign="id" cardinality="one" owner="foreign" />
                    <aggregate alias="Group" class="nwGroup" local="group" foreign="id" cardinality="one" owner="foreign" />

                    <field key="subscriber" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
                    <field key="group" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" />
                    </object>

                    </model>
                    <br /><br />[b]Current PHP code:[/b]<br /><br />

                    <?php
                    $subscriber = $modx->newObject('nwSubscriber');
                    $subscriber->set('name', 'Subscriber');
                    $subscriber->set('email', '[email protected]');
                    $subscriber->set('code', 'codet54tg4353wtgw34q');
                    $subscriber->set('active', '0');


                    $groups = array();
                    for ($i=1;$i<10;$i++) {
                    $group = $modx->newObject('nwGroup');
                    $group->set('name', 'Group '.$i);
                    $groups[] = $group;
                    }

                    $subscriber->addMany($groups, 'Subscribers');
                    $subscriber->save();
                    ?>
                    <br /><br />[b]Result[/b]<br />Both get saved, but the intersection table is not used.<br /><br />[b]Debugging[/b]<br /><br />Added related object with alias: Subscribers and pk: __new1<br />Array<br />(<br /> [id] => <br /> [name] => Group 2<br />)<br /><br />....<br /><br />No primary key value found for pk definition: id<br /><br /><br />....<br /><br />Could not save related object<br />Main object: Array<br />(<br /> [id] => <br /> [name] => Subscriber<br /> [email] => [email protected]<br /> [.code] => codet54tg4353wtgw34q<br /> [active] => 0<br />)<br /><br />Related Object: Array<br />(<br /> [id] => <br /> [name] => Group 1<br />)<br /><br />Help?
                      Jeroen Kenters

                      MODX Professional | MODX Ambassador | Dutch MODX forums moderator

                      website | twitter
                      • 34075 ☆ A M B ☆
                      • 130 Posts
                      Nobody knows what’s wrong here?
                        Jeroen Kenters

                        MODX Professional | MODX Ambassador | Dutch MODX forums moderator

                        website | twitter