web-dev-qa-db-ja.com

今日作成されたエンティティを選択してください

エンティティプロパティの1つはタイムスタンプであり、作成時に設定されます。

EntityFieldQuery クラスを使用して、今日作成されたエンティティをロードしたいと思います。

通常、私はDATE_FORMAT(FROM_UNIXTIME(created_timestamp), "%Y-%m-%d") = "2014-03-17"を使用してクエリを記述します。

MySQL関数をEntityFieldQueryで使用する方法を知りません。次のコードを試してみました。

_$day_start = strtotime(date('Y-m-d 00:00:00', $created_ts));
$day_end = strtotime(date('Y-m-d 23:59:59', $created_ts));
$query->propertyCondition('created', $day_start, '>')
  ->propertyCondition('created', $day_end, '<');
_

これは機能しますが、効率的ではなく、簡潔さも劣ります。 SelectQuery::where() のようにEntityFieldQueryで使用できる関数はありますか?次のようなコードを記述できますか?

_$query->propertyWhere('DATE_FORMAT(FROM_UNIXTIME(created), "%Y-%m-%d")', "2014-03-17");
_
2
Felix Eve

以下のコードを使用できます。PropertyConditionは、BETWEEN演算子を使用して範囲値を受け入れます。タイムスタンプはデータベースノードテーブルに整数として格納されるため、コードの下でデータと時間を一緒に作成した列は、特定の日付のレコードをフェッチします。

<?php
$day_start = strtotime(date('Y-m-d 00:00:00', $created_ts));
$day_end = strtotime(date('Y-m-d 23:59:59', $created_ts));
$query
    ->propertyCondition('created', array($day_start, $day_end), 'BETWEEN');
?>

D-Oで propertyCondition の詳細を確認する

4
Anil Sagar

いいえ、EntityFieldQueryにはそのようなメソッドはありません。ここでコードを取る場合:

$query
  ->propertyWhere('DATE_FORMAT(FROM_UNIXTIME(created), "%Y-%m-%d")', "2014-03-17");

ここで参照しているwhichプロパティ(列)を決定するためにDrupalが何をしなければならないかを想像してみてください。SQL文字列を解析して、フィールドメタデータを取得する前のcreated文字列-間違いなく、高価で不要な手順です。

EntityFieldQueryは、プロパティ/フィールドによるクエリエンティティにのみ使用されることになっているため、提供されるメソッドは(必然的に)制限されます。簡潔さの劣るメソッドは、サブクラス化や拡張をしなくても得られる最高のものだと思います。

2
Clive

EntityFieldQueryクラスを使用して、今日作成されたエンティティをロードしたいと思います。

その場合、SelectQuery::where()に相当するものは必要ありません。

作成日を将来の日付に設定できない場合は、次のコードを使用できます。

$query->propertyCondition('created', strtotime('today'), '>=');

それ以外の場合は、次のコードを使用します。

$query->propertyCondition('created', array(strtotime('today'), strtotime('today 23:59:59')), 'BETWEEN');
1
kiamlaluno