web-dev-qa-db-ja.com

日付フィールドが空で、別のフィールドのpostdateでソートされている場合は、hook_views_query_alter

NEWS NEWSには次のようなフィールドがあるタイプのすべてのコンテンツを表示するビューがあります。

コンテンツ=タイトル

スケジューラ=発行

並べ替え条件:2つのオプションでコンテンツを並べ替えたい:スケジューラあり(発行日= DESC)と投稿日あり

スケジューラでコンテンツを並べ替えたいのですが、スケジューラフィールドが空の場合、投稿日で並べ替えます。フックビュークエリの変更を作成しましたが、問題があります。publish_onが空の場合に条件でフィールドを並べ替えて、postdateで並べ替える方法を教えてください

function custom_sort_views_query_alter(&$view, &$query) {


    if($view->name === 'articleview') {
        $view->query->add_where(1,'publish_on',  'NOT IN');
        $view->query->orderby[0]['field'] = "CASE WHEN publish_on IS NULL THEN created ELSE publish_on END";
        $view->query->orderby[0]['direction'] = "DESC";
        $view->query->orderby[1]['field'] = "created";
        $view->query->orderby[1]['direction'] = "DESC";
    }
}
3
Salaktarus

私の頭に浮かぶ解決策は、(質問のコメントの後に)2つのクエリを作成することです。1つは、publish_onフィールドが空で、もう1つはフィールドが空ではないレコードを使用して、それらの間でUNIONを使用します。

なんでこれ? AFAIKある条件に基づくクエリの一部のレコードと別の条件に基づく他のレコードを並べ替えることができないため、これを実現するには、レコードを分割して、並べ替え方法を個別に適用する必要があります。これは最初の条件のレコードとそれ以前の別の条件のレコードですが、レコードと注文条件をマージすることはできません。

多分この投稿はあなたを助けることができます:

https://stackoverflow.com/q/2258376/3653989

https://stackoverflow.com/q/19296047/3653989

https://stackoverflow.com/q/3730093/3653989

多分あなたも読みたいと思う http://www.w3schools.com/sql/sql_union.asp

2