2016-08-04 3 views
1

からフィールド上のVirtualPagesのリストを並べ替え:最高の何

class ContentPage extends Page { 

    /** 
    * @var array 
    */ 
    private static $db = [ 
     'Highlighted' => 'Boolean' 
    ]; 

    // ... 

} 

class AreaPage extends Page { 

    /** 
    * @var array 
    */ 
    private static $many_many = [ 
     'RelatedVirtualPages' => 'VirtualPage' 
    ]; 

    // ... 

} 

RelatedVirtualPagesContentPage秒からコンテンツをコピーしています方法はのRelatedVirtualPagesHighlightedのdbフィールドに並べ替えてコピーしますか?

+1

'RelatedVirtualPages' => 'VirtualPages'は 'RelatedVirtualPages' => 'VirtualPage'にする必要がありますか? – jberculo

+0

はい、あなたは正しいです:-)更新された質問 –

答えて

3

仮想ページは異なるタイプのページをポイントすることができ、これらのページのすべてがContentPages、または少なくともHightlighted dbフィールドを持つページであるという強制はありません。 SiteTreeを作成するときにこれを手動で確認することはできますが、ユーザーはそれを念頭に置いてそれを念頭に置いてください。

ここに、始めるのに役立つ擬似コードがあります。すべての仮想ページがContentPagesであることを前提としています。 AreaPageによって参照されるVirtualPagesの複数のタイプがある場合、これはおそらく十分ではありません。

$virtualPages = $myAreaPage->RelatedVirtualPages(); 
$contentSourcePages = ContentPage::get()->byIDs($virtualPage->column('CopyContentFromID')); 
$sortedSourcePages = $contentSourcePages->sort('Highlighted','ASC'); 

あなたはおそらくもinnerJoinを使用することができますが、その後、あなたは、いくつかの複雑なシナリオにつながる可能性が_Liveテーブルや場合によっては複数のページテーブル(再びちょうどVirtualPageとしてContentPageを使用していない場合)に対処する必要があります。

更新

だから、私自身の言葉で要約するために、あなたはそれにそれぞれVirtualContentPageリンクContentPageからHighlightedフィールドでソート特定AreaPageにリンクVirtualContentPagesのリストを必要としています。この要約は、この作品は希望正確である場合:

$sortedVirtualPages = $myAreaPage->RelatedVirtualPages() 
->innerJoin('ContentPage', '"ContentPage"."ID" = "VirtualContentPage"."CopyContentFromID"') 
->sort('Highlighted DESC'); 
+0

答えをくれてありがとう、私を方向づけてくれてありがとう。擬似コードは私に 'ContentPage'のソートされたリストを与えますが、実際の' VirtualPage'のリストが必要です。 'VirtualPage'を取得し、それらを反復し、各オブジェクトに' Highlighted'プロパティを追加して(コピーしているページから値をコピーして)、ArrayListに追加して、 'Highlighted'でArrayListをソートします。思考? –

+0

ページタイプを「ContentPage」として強制するために、私は問題の簡単なデモンストレーションを提供するためにこれらの部分を省いた。実際のコードでは、これはVirtualPage( 'VirtualContentPage'、' [VCP] ')を拡張していて、' VCP'は 'VCP'と' ContentPage '。エディタが 'AreaPage'からコンテンツをコピーするために' VCP'を変更すると、検証エラーがスローされます(〜 'AreaPage'は' AreaPage'の子として許可されません)。 –

+1

ありがとう!要約は正確であり、内部結合ソリューションは確かに最も効率的でクリーンなソリューションです。 –

0

は、あなただけの

//just get one areapage 
$AreaPageItem = AreaPage::get()->First(); 

//now get the RelatedVirtualPages sorted 
$related_pages = $AreaPageItem->RelatedVirtualPages()->sort("Highlighted","ASC"); 
+0

これは残念ながら、VirtualPageに 'Highlighted'カラムが存在せず、MySQLエラーが発生するため動作しません。 –

1

を行うことができませんでした私は非常にクリーンな方法を見つけることができませんでしたが、これを達成する2つの方法を見つけました。この関数は、

public function getRelatedVirtualPages() 
{ 

    $items = $this->getManyManyComponents('RelatedVirtualPages'); 

    $highlighted = $items->filterByCallback(function($record, $list) { 
     if($record->CopyContentFrom() instanceOf ContentPage) { 
      //return ! $record->CopyContentFrom()->Highlighted; // ASC 
      return $record->CopyContentFrom()->Highlighted; // DESC 
     } 
    }); 

    $highlighted->merge($items); 
    $highlighted->removeDuplicates(); 

    return $highlighted; 
} 

第二に、私はこれらのソリューションのいずれかの非常に誇りに思っていないよ(あなたは、コメントに記載された方法)

public function getRelatedVirtualPages() 
{ 
    $items = $this->getManyManyComponents('RelatedVirtualPages'); 

    $arrayList = new ArrayList(); 

    foreach($items as $virtualPage) 
    { 
     if($virtualPage->CopyContentFrom() instanceOf ContentPage) { 
      $virtualPage->Highlighted = $virtualPage->CopyContentFrom()->Highlighted; 
      $arrayList->push($virtualPage); 
     } 
    } 

    $arrayList = $arrayList->sort('Highlighted DESC'); 

    return $arrayList; 
} 

AreaPage
ファーストクラスで行きます私は彼らがあなたの基準に合っていると信じています。

+1

ありがとう!興味深い解決策1.別のフィールドでもソートする必要があるという事実でないなら、私はそれを求めています。これは 'Boolean'ではなく' Date'です。ソリューション2は私が最初に行ったことですが、パフォーマンスの面では高価だと感じました - 各繰り返し(?)のデータベースを照会してください。 AlphaCactusのインスピレーションを受けて2つのクエリを実行し、結果を保存するように少し修正しました。私の答えを見る –

1

は、ここで私は作品を考えている、私がやってしまったものです:

/** 
* @return ArrayList 
*/ 
public function VirtualPages() 
{ 

    $result  = []; 
    $virtualPages = $this->RelatedVirtualPages(); 
    $contentPages = ContentPage::get() 
     ->byIDs($virtualPages->column('CopyContentFromID')) 
     ->map('ID', 'Highlighted') 
     ->toArray(); 

    foreach($virtualPages as $virtualPage) { 
     $highlighted = $contentPages[$virtualPage->CopyContentFromID]; 
     $virtualPage->Highlighted = $highlighted; 
     $result[] = $virtualPage; 
    } 

    return ArrayList::create(
     $result 
    ); 

} 

そして、それはそうのようなソート可能です:

$areaPage->VirtualPages()->sort('Highlighted DESC'); 

は、すべての答えとポインタをありがとうございました。私は何か答えをマークする前に少し待つでしょう。

関連する問題

 関連する問題