UPDATE

i worked with my form inputs and the Controller a bit, and i DO have 
functioning saves working again (for the next ten minutes until it breaks 
again). i'll describe what i had to do, and why i don't like it.

Form inputs:
Basically, i have to scrap the idea of the ORM carrying data to the pivot 
table. i have my main inputs all named according to their Listings column. 
For the data that will go to ListingsAttributes, i prefix the input with 
'attributes.column':
<!-- 3 is the index position of the input group, 1 is the actual record ID 
-->
<input name="attributes[3][attribute_id]" value="1" type="checkbox">
<input name="attributes[3][value]" type="text">

In the Controller:
$listing = $this->Listings->newEntity();
if ($this->request->is('post')) {
    // Grab the 'attributes' data - arrays of attribute_id / value pairs
    $attributeData = $this->request->data['attributes'];
    // Can't leave the 'attributes' in the request data for the entity 
patch, Listings save fails.
    unset($this->request->data['attributes']);
    // NOTE: NO 'association' key. Just a single save action.
    $listing = $this->Listings->patchEntity($listing, $this->request->data);
    // Save the link records one-by-one
    foreach ($attributeData as $attrData) {
        $attribute = $this->Listings->Attributes->get($attrData[
'attribute_id']);
        $attribute->_joinData = new Entity(['value' => $attrData['value']]);
        $this->Listings->Attributes->link($listing, [$attribute]);
    }
}

Of course there's the redirect after everything succeeds & so on.

Why this is awful:

   1. Absolutely NOT what's documented for this approach OR for the 
   supposedly easier ['associated' => ['Attributes._joinData']] i was 
   struggling with.
   2. Cramming inputs into the form only to extract them to a separate data 
   set, unset them from the original, then loop through them for individual 
   save actions. This is not what i envisioned ORM sweetness to be.
   3. Non-transactional - at any point, a save can fail and i get PART of 
   the data, and can't roll back to make the user try the entire transaction 
   over again. Instead, i'd have to have cleanup code in my *add* action to 
   sweep up behind a failed save.
   4. i suppose i *could* do it in a manually-set transaction, but that 
   goes right back to defeating the purpose of the ORM.

Since there was someone on IRC also experiencing the same struggle i'm 
having, i'll hang out there a while to see if markstory comes back around 
to address it. It just baffles me that this particular data scenario does 
NOT work.

He even seemed to concede that the task we are trying to accomplish isn't 
directly accounted for in the test cases. One of the tests is for a 
Create/Update on both sides of the association, which i think is clear by 
now i'm NOT trying to do. The other test case he showed us retrieves an 
existing Entity and does an Update with a Create/Update on the other end 
and _joinData in between. When we explained we want to save only on ONE 
side & the pivot, and leave the other end untouched, he agreed the tests 
don't specifically account for that. So if i can catch him online, 
hopefully we can sort out whether it's something i'm still doing wrong, or 
the ORM, the Marshaler, or whatever.

Thanks again for the help. i'll follow up if i learn anything more.


On Friday, 13 March 2015 13:13:30 UTC-4, heavyKevy wrote:
>
> I believe that is your answer you were looking for... 
> I missed it too. 
>
> Thanks Jose for pointing that one out.

-- 
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