2

データベースから記事を見つける必要があり、隣人の次と前のIDも必要です。現在、機能するクエリが 3 つあります。最初の 2 つは find() メソッドがありません。

$artNext = ArticlesQuery::create()
            ->filterById(array('min' => $artId + 1))
            ->filterByActive(1)
            ->filterByType(1)
            ->select('Id')
            ->orderById(Criteria::ASC)
            ->limit(1);


$artPrev = ArticlesQuery::create()
            ->filterById(array('max' => $artId - 1))
            ->filterByActive(1)
            ->filterByType(1)
            ->select('Id')
            ->orderById(Criteria::DESC)
            ->limit(1);


$article = ArticlesQuery::create()
            ->filterByActive(1)
            ->filterById($artId)
            ->findOne();

次のクエリのように、artPrev サブクエリと artNext サブクエリを組み合わせて挿入するにはどうすればよいですか (簡略化)

select id,
(select id from articles where id<77 ORDER BY id DESC limit 1 ) as prev,
(select id from articles where id>77 ORDER BY id ASC limit 1) as next
from articles 
where id=77
4

2 に答える 2

0

別のアプローチ:

ID が 1 ずつ増分され、削除も省略もされていない場合は、次のようにすることができます。

$article = ArticlesQuery::create()
    ->filterByActive(1)
    ->filterById($artId)
    ->_or()
    ->filterById($artId-1)
    ->_or()
    ->filterById($artId+1)
    ->withColumn('Articles.Id','id')
    ->withColumn(('IF Articles.Id ='.$artId.',"current",(IF Articles.Id ='.$artId+1.',"next","prev"))','position')
    ->find();

これにより、このような 3 つの「行」を持つ $article オブジェクトが得られます (ArtId が再び 20 であると仮定します)。

(0) 
    id=19
    position=prev
(1) 
    id=20
    position=current
(2) 
    id=21
    position=next

私が言ったように:完全に別のアプローチ。ただし、受け入れる必要があります。「論理的に関連」していない 3 つのクエリを 1 つにマージすることはできません。プログラミング言語またはデータベース抽象化レイヤーでエレガントなアプローチによってそのように見せかけたとしても、データベース エンジンによって常に 3 つのクエリが実行されることになります。

お役に立てれば!

于 2013-10-03T17:02:10.150 に答える