title: Entity method loading twice
body: <p>Lately I've been building a Drupal 7 module with the Entity API but I've run in to a problem. When debugging an edit form I've noticed that the load method is called twice which is causing an error.</p>
  
  <blockquote>
    <p>Recoverable fatal error: Object of
    class stdClass could not be converted
    to string in
    DatabaseStatementBase->execute()
    (regel 2039 van
    /drupal7/includes/database/database.inc).</p>
  </blockquote>
  
  <p>This is caused by FooController::load being executed twice.</p>
  
  <p>Underneath is the code I've been using.</p>
  
  <pre><code>function foo_menu() {
    $items = array();
    ...
    $items['admin/foo/%foo/edit'] = array(
      'title' =&gt; 'Edit foo',
      'page callback' =&gt; 'foo_edit',
      'page arguments' =&gt; array(2),
      'access arguments' =&gt; array('administer content'),
      'type' =&gt; MENU_CALLBACK,
    );
    ...
    return $items;
  }
  
  function foo_edit($foo) {
    return drupal_get_form('foo_edit_form', $foo);
  }
  
  function foo_edit_form($form, &amp;$form_state, $foo) {
    $form['#foo'] = $foo;
    $form_state['values'] = $foo;
  
    $form['id'] = array(
      '#type' =&gt; 'hidden',
      '#value' =&gt; $foo-&gt;id,
    );
    ...
    $form['picture'] = array(
      '#type' =&gt; 'file',
      '#title' =&gt; t('Picture'),
      '#default_value' =&gt; $foo-&gt;picture-&gt;filename,
    );
    ...
    $form['submit'] = array(
      '#type' =&gt; 'submit',
      '#value' =&gt; t('Save'),
    );
  
    return $form;
  }
  
  function foo_edit_form_submit($form, &amp;$form_state) {
    $foo = (object)$form_state['values'];
  
    if ($picture = file_save_upload('picture')) {
      $picture = file_move($picture, FOO_FILE_PATH . $picture-&gt;filename, FILE_EXISTS_RENAME);
      $picture-&gt;status |= FILE_STATUS_PERMANENT;
      $picture = file_save($picture);      
      $foo-&gt;picture = $picture-&gt;fid;
    }
  
    entity_get_controller('foo')-&gt;save($foo);
  
    drupal_set_message(t('Foo saved.'));
    $form_state['redirect'] = 'admin/foo';
  }
  </code></pre>
  
  <p>And probably the most important part:</p>
  
  <pre><code>function foo_load ($id) {
    $foo = foo_load_multiple(array($id));
    return $foo ? $foo[$id] : FALSE;
  }
  function foo_load_multiple ($ids = array(), $conditions = array()) {
    return entity_load('foo', $ids, $conditions);
  }
  class FooController extends DrupalDefaultEntityController {
    ...     
    function load ($ids = array(), $conditions = array()) {
      $foos = parent::load($ids, $conditions);
  
      // Code executed twice
      error_log('FooController::load');
  
      foreach ($foos as $foo) {
        $foo-&gt;picture = file_load($foo-&gt;picture);
      }
      return $foos;
    }
    ...
  }
  </code></pre>
  
  <p><strong>Edit: callstack</strong></p>
  
  <pre><code>... (Array, 11 elements)  
      11: load (Array, 7 elements)  
      10: entity_load (Array, 4 elements)  
      9: foo_load_multiple (Array, 4 elements)  
      8: foo_load (Array, 4 elements)  
      7: _menu_load_objects (Array, 4 elements)  
      6: _menu_translate (Array, 4 elements)  
      5: menu_get_item (Array, 4 elements)  
      4: menu_get_custom_theme (Array, 4 elements)  
      3: menu_set_custom_theme (Array, 4 elements)  
      2: _drupal_bootstrap_full (Array, 4 elements)  
      1: drupal_bootstrap (Array, 4 elements)  
  Called from /sites/bar/modules/custom/foo/foo.module, line 367  
  
  ... (Array, 20 elements)  
      20: load (Array, 7 elements)  
      19: entity_load (Array, 4 elements)  
      18: foo_load_multiple (Array, 4 elements)  
      17: foo_load (Array, 4 elements)  
      16: _menu_load_objects (Array, 4 elements)  
      15: _menu_translate (Array, 4 elements)  
      14: menu_local_tasks (Array, 4 elements)  
      13: menu_tab_root_path (Array, 4 elements)  
      12: menu_get_active_help (Array, 4 elements)  
      11: system_block_view (Array, 2 elements)  
      10: call_user_func_array (Array, 4 elements)  
      9: module_invoke (Array, 4 elements)  
      8: _block_render_blocks (Array, 4 elements)  
      7: block_list (Array, 4 elements)  
      6: block_get_blocks_by_region (Array, 4 elements)  
      5: block_page_build (Array, 4 elements)  
      4: drupal_render_page (Array, 4 elements)  
      3: drupal_deliver_html_page (Array, 4 elements)  
      2: drupal_deliver_page (Array, 4 elements)  
      1: menu_execute_active_handler (Array, 4 elements)  
  Called from /sites/bar/modules/custom/foo/foo.module, line 367  
  </code></pre>
  
  <p>Has anybody experienced this problem before?</p>
  
  <p>Thanks in advance.</p>
  
  <p><strong>Solution (thanks to @Berdir):</strong></p>
  
  <p>Instead of overriding DrupalDefaultEntityController::load(), using attachLoad():</p>
  
  <pre><code>protected function attachLoad(&amp;$foos, $revision_id = FALSE) {
      foreach ($foos as $foo) {
        $foo-&gt;picture = file_load($foo-&gt;picture);
      }
      parent::attachLoad($foos, $revision_id);
    }
  </code></pre>