Wednesday, April 8, 2015

Re: Still having trouble with saving BelongsToMany data

i have same problem, i can't save all my associated data. so for now i have to do it manualy save my associated one model by one model. José Lorenzo  i hope cookbook give us more clear example hove to save associated models.

On Sunday, February 22, 2015 at 9:01:16 AM UTC+7, Joe T. wrote:
So, i had a thread going here: https://groups.google.com/forum/#!topic/cake-php/PMtHkEvIURo

Never got anywhere on solving this. Decided a new thread was called for because tables have changed & documentation has been updated, but i'm having the same problem.

i'll try to explain as clearly as i can...

i have two B2M tables: listings and attributes. The pivot table is listings_attributes:
listings_attributes:
id
listing_id  
-FK-> listings.id
attribute_id
-FK-> attributes.id
value

The Table connections look like this:
ListingsTable::initialize
$this->addAssociations([
    'belongsTo'     => [ /* some other tables */ ],
    'hasMany'       => [ /* another table */ ],

    'belongsToMany' => [
        'Attributes' => [
            'through' => 'ListingsAttributes'
        ]
    ]
]);


AttributesTable::initialize

$this->belongsToMany('Listings', [
    'through' => 'ListingsAttributes'
]);


ListingsAttributesTable::initialize
$this->belongsTo('Listings');
$this->belongsTo('Attributes');


The Attributes are already established. i'm not adding new Attributes when i save a Listing. The documentation's example is Articles & Tags, and implies new Tags are created with a new Article, while the _joinData "starred" is saved to the pivot table articles_tags.

So my form inputs look like this (following the example from documentation):
<input name="attributes[0][id]" value="3" id="attributes-0-id" type="checkbox"> Bathrooms
<input name="attributes[0][_joinData][value]" id="attributes-0-joindata-value" type="text">

<input name="attributes[1][id]" value="2" id="attributes-1-id" type="checkbox"> Bedrooms
<input name="attributes[1][_joinData][value]" id="attributes-1-joindata-value" type="text">

<input name="attributes[2][id]" value="4" id="attributes-2-id" type="checkbox"> Laundry
<input name="attributes[2][_joinData][value]" id="attributes-2-joindata-value" type="text">

<input name="attributes[3][id]" value="1" id="attributes-3-id" type="checkbox"> Parking
<input name="attributes[3][_joinData][value]" id="attributes-3-joindata-value" type="text">



The idea is, an Attribute is checked, and a value entered that goes to the listings_attributes table. In my test, i'm checking "Parking" (ID 1, index 3), and entering "Off-street" as its value.

My response data looks like (from Log::debug):
Array
(
   
// Various fields about the listing, and this section for the attributes:
   
[attributes] => Array
       
(
           
[3] => Array // Index for this Attribute in the form's inputs.
               
(
                   
[id] => 1 // Attribute record ID for "Parking"
                   
[_joinData] => Array // Data intended for the ListingsAttributes table
                       
(
                           
[value] => Off-street
                       
)
               
)
       
)
)

To me, this looks much like the documentation example for Students / Courses:
$data = [
    'first_name' => 'Sally',
    'last_name' => 'Parker',
    'courses' => [
        [
            'id' => 10,
            '_joinData' => [
                'grade' => 80.12,
                'days_attended' => 30
            ]
        ],
        // Other courses.
    ]
];
$student = $this->Students->newEntity($data, [
    'associated' => ['Courses._joinData']
]);

In my controller, i create the Entity thus (just like the example above):
$listing = $this->Listings->newEntity($this->request->data, ['associated' => ['Attributes._joinData']]);

When i call $this->Listings->save($listing) i'd expect the listings record to be saved, then the ID for that added to the associated data for listings_attributes:
listings_id  : 1            (newly generated)
attributes_id
: 1            (selected from the form)
value        
: 'Off-street' (set in the form)

When i log $listing->jsonSerialize(), it looks like this:
Array
(
    // Various fields about the listing, and this section for the attributes:
   
[attributes] => Array
       
(
           
[0] => Array
               
(
               
)
       
)
)

The result of this is the listings record is not saved, nor the listings_attributes.

So, where did the Attribute data go? Is something wrong with the Table classes? Can anyone tell me what's wrong here? If you need more information, please let me know.

Thank you.
-joe

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

No comments: