web-dev-qa-db-ja.com

EntityFieldQueryまたはビューを使用して次の3つの日付をクエリするにはどうすればよいですか? (7)

これが私の最初の質問なので、あまり厳しくしないでください。私はこの2、3日の間、運が悪ければこれを解決しようと努めてきました。

イベントの「開始日時」のカスタム日付フィールドを含む「イベント」というコンテンツタイプがあります。現在のタイムスタンプの次の3日間のイベントを一覧表示できるようにする必要があります。

空の日はカウントされないことに注意してください。たとえば、明日のイベントがない場合、それは空の日としてカウントされません。代わりに、翌日以降のイベントが一覧表示されます(その日のイベントがあると想定)。

ストレートSQLを介してカスタム日付フィールドにアクセスできた場合、最初に必要な3つの日付を取得し、クエリは次のようになります。

SELECT DISTINCT(DATE(`date_field`)) 
FROM {node} 
WHERE `type` = 'event' 
AND `field_start_test_date` > NOW() 
ORDER BY DATE(`date_field`) ASC 
LIMIT 3;

ViewsまたはEntityFieldQueryでこれを達成することはできませんでした。また、SQLを使用して独自の結合を作成することもできますが、読んだことからはお勧めできません。私はどんな提案にも開放的です。より具体的にする必要がある場合はお知らせください。

ありがとう!

1

私は今これに戻っています。私は自分の問題に対する最もエレガントな解決策であると私が信じているものを見つけました。

私はそれを二つの部分に分解しなければなりませんでした。私が最初にすべきことは、次の3日間のイベントを取得することでした。私はこのMySQLクエリでそれをしなければなりませんでした:

$dates_query =
"   
SELECT  
    DISTINCT(DATE({field_start_date}.field_start_date_value)) AS start_date 
FROM 
    {node} 
    INNER JOIN {field_body} ON ({field_body}.revision_id = {node}.vid) 
    INNER JOIN {field_start_date} ON ({field_start_date}.revision_id = {node}.vid) 
WHERE 
    {node}.status = 1 AND
    {node}.type = 'event' AND 
    {field_start_date}.field_start_date_value >= CURDATE() 
ORDER BY {field_start_date}.field_start_date_value ASC 
LIMIT 3;
;"; 

そのクエリは、イベントを含む次の3つの日付(存在する場合)を取得する必要があります。そこから、日付をループして、EntityFieldQueryを使用してイベントを取得するこの関数にそれらを渡す必要がありました。

function getEventsByDate($date)
{
    //Function to return a list of events for a specific date using EntityFieldQuery

    //start and end timestamps to query between (MySQL format)
    $start = date('Y-m-d', strtotime($date));
    $end = date('Y-m-d', strtotime($date . ' +1 day'));

    $events_query = new EntityFieldQuery;
    $events_query           
        ->entityCondition('entity_type', 'node')
        ->entityCondition('bundle', 'event') //get content types of event
        ->propertyCondition('status', 1) //published nodes only
        ->fieldCondition('field_start_test_date', 'value', array($start, $end), 'BETWEEN')
        ->fieldOrderBy('field_start_test_date', 'value', 'ASC');
    $events_results = $events_query->execute();

    return $events_results; 
}

これを手伝ってくれてありがとう。

1

あなたの質問で得たクエリは、このEntityFieldQueryと同等です:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->fieldConditon('field_start_test_date', 'value', REQUEST_TIME, '>')
  ->fieldOrderBy('field_start_test_date')
  ->range(0, 3);

$results = $query->execute();
if (!empty($results['node'])) {
  $nodes = node_load_multiple(array_keys($results['node']));
}

date_fieldfield_start_test_dateおよび日付列がUNIXタイムスタンプタイプであること。これらの仮定が正しくない場合は、少し変更を加える必要があります。

2
Clive