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: *li**stings* 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 
<http://book.cakephp.org/3.0/en/views/helpers/form.html#associated-form-inputs>
):
<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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

Reply via email to