web-dev-qa-db-ja.com

Drupal db_select join 3 fields

選択した3つのfcフィールドに参加したい:

  • field_data_field_show_block_carousel
  • field_data_field_poster_film
  • field_data_field_film_link

私はこれを試します:

$nids = db_select('node', 'n');
  $nids->join(array('field_data_field_show_block_carousel', 'field_data_field_poster_film', 'field_data_field_film_link',), 'fc', 'n.nid = fc.entity_id');
  $nids->fields('fc', array('field_poster_film_fid','field_film_link_url',));
  $nids->fields('n', array('nid', 'title', 'uid',))
    ->condition('n.type', 'vodeo_library')
    ->condition('fc.field_show_block_carousel_value', 1)
    ->execute(); // returns an indexed array
  $result = $nids->execute()->fetchAllAssoc('nid');

しかし、受信したSQLエラー? plsは私が間違っていることを教えてくれますか?

1
Artyom Kondra

各結合は、配列としてではなく、新しい行に記述してください。 Joins および public function SelectQuery :: join を参照してください。

したがって、次のように試してください。

$nids = db_select('node', 'n');
  $nids->join('field_data_field_show_block_carousel', 'fc', 'n.nid = fc.entity_id');
  $nids->join('field_data_field_poster_film', 'fp', 'n.nid = fp.entity_id');
  $nids->join('field_data_field_film_link', 'fl', 'n.nid = fl.entity_id');
  $nids->fields('fp', array('field_poster_film_fid'));
  $nids->fields('fl', array('field_film_link_url'));
  $nids->fields('n', array('nid', 'title', 'uid',))
    ->condition('n.type', 'vodeo_library')
    ->condition('fc.field_show_block_carousel_value', 1)
    ->execute(); // returns an indexed array
  $result = $nids->execute()->fetchAllAssoc('nid');

モジュールが達成しようとしていることに応じて、デフォルトのDrupal関数を確認することもできます(1つのフィールドにのみ条件があります))。

次のようなレンダリングされたフィールド値を取得できます。

$node = node_load($nid);
$poster= field_get_items('node', $node, 'field_data_field_poster_film');
$output = field_view_value('node', $node, 'field_data_field_poster_film', $poster[0]);

少しオーバーヘッドが気にならない場合は、 EntityFieldQuery を試してみてください。すべてのフィールドが表示され、通常のSQLクエリよりも少し遅くなりますが、読み取りと変更がはるかに簡単です。

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'vodeo_library')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_show_block_carousel_value', 'value', 1, '=');

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
1
Neograph734

次のクエリを使用してください。

注:$ nids-> fields( 'fc'、array( 'field_poster_film_fid'、 'field_film_link_url'));のテーブルエイリアスを変更します。それに応じて。

$nids = db_select('node', 'n');
$nids->join('field_data_field_show_block_carousel', 'fc', 'fc.entity_id = n.nid');
$nids->join('field_data_field_poster_film', 'ff', 'ff.entity_id = n.nid');
$nids->join('field_data_field_film_link', 'fl', 'fl.entity_id = n.nid');
$nids->fields('fc', array('field_poster_film_fid','field_film_link_url'));
$nids->fields('n', array('nid', 'title', 'uid'))
    ->condition('n.type', 'vodeo_library')
    ->condition('fc.field_show_block_carousel_value', 1, '=')
    ->execute(); // returns an indexed array
$result = $nids->execute()->fetchAllAssoc('nid');
0
Yatendra Singh