0

こんにちは、cakePHP 形式を使用して書きたい PostgreSQL クエリがあります。

SELECT 
  id, 
  title, 
  author, 
  postdate, 
  postcontent, 
  userID 
FROM posts 
WHERE 
  userID = 12 
  AND id IN (SELECT articleID FROM favourites WHERE articlesUserID = 12) 
ORDER BY postdate DESC;

これは私のクエリが現在 CakePHP で持っているフォーマットです:

$favouritearticles = $this->Favourite->query('SELECT id, title, author, postdate, postdatecreation, posteditdate, postcontent, "userID" FROM posts WHERE "userID" = '.$userID.'AND id IN (SELECT lngblogarticleid FROM favourites WHERE lngloginuserid = '.$userID.') ORDER BY postdate DESC');

動作していますが、エコー json_encode の場合、次のような結果になります:

echo json_encode($favouritearticles);

次のような無効なjson形式を取得します:(JSONLintで確認)

[
    [
        {
            "id": 2,
            "title": "Prison Or Treatment For the Mentally ill ",
            "author": "mike123",
            "postdate": "March 12, 2013 at 6:46 pm",
            "postdatecreation": "2013-03-12",
            "posteditdate": null,
            "postcontent": "<p><span>The public revulsion over repeated mass shootings has placed mental health in the spotlight. This is both good and bad.<\/span><\/p>",
            "userID": 34
        }
    ]
][

]

だから私はおそらく、「findメソッドを使用して」cakePHP形式を使用してクエリを書き直す必要があると思いました:

$favouritearticles = $this->Favourite->find('all',array('conditions'=>array(".........

ただし、クエリは非常に複雑で、その方法がわかりません。助けてくれてありがとう。

4

1 に答える 1

1

JSON の形式は、最後に余分な [ ] を除いて問題ありません。それでもクエリを CakePHP 形式で書き直したい場合は、以下を使用します。

private function getFavouritePostsByUserId($userId) {
    $db = $this->Post->getDataSource();
    $subQuery = $db->buildStatement(
        array(
            'fields' => array('Favourite.articleID'),
            'table' => $db->fullTableName($this->Favourite),
            'alias' => 'Favourite',
            'conditions' => array(
                'Favourite.articlesUserID' => $userId
            ),
        ),
        $this->Favourite
    );
    $subQuery = 'Post.id IN (' . $subQuery . ') ';
    $subQueryExpression = $db->expression($subQuery);
    $conditions = array($subQueryExpression, 'Post.userID' => $userId);
    $fields = array('Post.*');
    $order = 'Post.postdate DESC';
    $this->Post->find('all', compact('conditions', 'fields', 'order'));
}
于 2013-03-24T13:51:37.227 に答える