title: Why would Propel not save this query, and also not give any errors?
body: <p>I have a collection of  tables like so:</p>
  
  <p><code>logbook</code>, <code>responsibility</code>, <code>user</code></p>
  
  <p>Responsibilities are reused - but only one distinct responsibility per logbook. Each responsibility has one user. A user can have multiple responsibilities (on multiple logbooks). I have a table to join these together:</p>
  
  <p><code>logbook_responsibility</code>, with three colummns (each making up the primary key) - <code>logbook_id</code>, <code>responsibility_id</code> and <code>user_id</code>, which are all foreign keys. In my <code>schema.xml</code> this table is set <code>isCrossRef="true"</code>.</p>
  
  <p>When updating a responsibility to a new user, I am passed in an array in <code>$_POST</code> in the form of <code>$_POST['responsibility'][2] = 5</code>, <code>$_POST['responsibility'][7] = 2</code>, etc. I have a function that is supposed to update them:</p>
  
  <pre><code>public function updateResponsibilities($options = null)
  {
    foreach ($options['responsibility'] as $k =&gt; $v) {      
      $user = UserQuery::create()
        -&gt;filterByLogbook($this-&gt;logbook)
        -&gt;findOneById($v);
  
      $logbookResponsibility = LogbookResponsibilityQuery::create()
        -&gt;filterByLogbook($this-&gt;logbook)
        -&gt;filterByResponsibilityId($k)
        -&gt;findOne();
  
      if (is_null($user) || is_null($logbookResponsibility)) {
        break;
      }
  
      $logbookResponsibility-&gt;setUser($user)-&gt;save();
    }
  
    return true;
  }
  </code></pre>
  
  <p>Here I loop through the options, create a new user with the supplied ID, filter by the current logbook to make sure they're allowed to be responsible for this logbook, and grab the first one. This works fine (dumped with <code>-&gt;toArray()</code>:</p>
  
  <pre><code>array(11) {
    ["Id"]=&gt;
    int(2)
    ["CompanyId"]=&gt;
    int(1)
    ["CurrentLogbookId"]=&gt;
    int(1)
    ["OtherFieldsHere..."]=&gt;
    // etc, etc
  
  }
  </code></pre>
  
  <p>Next I grab a LogbookResponsibility, filtering again by the current logbook and the responsibility ID. At this stage the new user ID is shown correctly:</p>
  
  <pre><code>array(3) {
    ["LogbookId"]=&gt;
    int(1)
    ["ResponsibilityId"]=&gt;
    int(1)
    ["UserId"]=&gt;
    int(1)
  }
  </code></pre>
  
  <p>I then update this object with the previously grabbed user, and save. I get no errors doing this, and inspecting the object afterwards shows that the object, at least, has updated:</p>
  
  <pre><code>array(3) {
    ["LogbookId"]=&gt;
    int(1)
    ["ResponsibilityId"]=&gt;
    int(1)
    ["UserId"]=&gt;
    int(2)
  }
  </code></pre>
  
  <p>But, without touching anything else, looking at the database after, the user ID is still 1. I've tested running a query like:</p>
  
  <pre><code>UPDATE logbook_responsibility SET user_id = 1 WHERE logbook_id = 1 AND responsibility_id = 1;
  </code></pre>
  
  <p>...which works without error.</p>
  
  <p>My <em>actual</em> question is two-fold:</p>
  
  <p><strong>1)</strong> Why isn't it saving? <em>(Is it to do with my cross ref table? Is there a problem with cross ref tables with more than 2 columns?)</em></p>
  
  <p><strong>2)</strong> Is there generally a <em>better</em> way to achieve my setup? *(I tried achieving the same with a responsibility object, but didn't see a way to update the logbook_responsibility from there)*</p>
  
  <p>Happy to take suggestions as well as an actual answer!</p>