2

Symfony 1.4/Doctrine 1.2 ORM でアプリを構築していますが、MYSQL クエリを実装してビューで教義オブジェクトとして使用するのに問題があります。

ドクトリン オブジェクトにハイドレートする必要がある実際の MYSQL クエリを次に示します。

SELECT u.id, u.username, p.picture AS picture, p.fb_user_id AS fb_user_id, p.fb_access_token AS fb_access_token, hot_scores.hot_user_score, SUM(b.incremental_points) as total_points
FROM sf_guard_user u
LEFT JOIN sf_guard_user_profile p ON p.user_id = u.id
LEFT JOIN mb_stats_bosspoints b ON b.user_id = u.id AND b.date >= '2012-03-20' AND b.date <= '2012-03-30' AND b.parent_genre_id = 10
LEFT JOIN (SELECT SUM(g.score) AS hot_user_score, g.user_id AS user_id
  FROM mb_score_by_genre g
  WHERE g.parent_genre_id = 10
  GROUP BY g.user_id
  ) hot_scores ON hot_scores.user_id = u.id
GROUP BY u.id
HAVING total_points >= 0
ORDER BY total_points DESC
LIMIT 10;

最後の左結合の複雑な SELECT サブクエリのため、DQL を使用してこのクエリを作成する方法がわかりませんでした。そこで、doctrine raw sql を使用することにしました。しかし、別の投稿 [Here][1] で、Doctrine の生の SQL クエリで集計値を使用する際に問題があることを知りました。とにかくやってみることにしました。

これは、クエリまたは実行されたクエリを返す関数内の私のドクトリンの生のSQLクエリです。

$q = new Doctrine_RawSql();
$q->select('{u.id}, {u.username}, {p.picture} AS {picture}, {p.fb_user_id} AS {fb_user_id}, {p.fb_access_token} AS {fb_access_token}, {hot_scores.hot_user_score}, {SUM(b.incremental_points)} AS {total_points}');
$q->from("sf_guard_user u
LEFT JOIN sf_guard_user_profile p ON p.user_id = u.id
LEFT JOIN mb_stats_bosspoints b ON b.user_id = u.id AND b.date >= '".$start_date."' AND b.date <= '".$end_date."' AND b.parent_genre_id = ".$parent_genre_id."
LEFT JOIN (SELECT SUM(g.score) AS hot_user_score, g.user_id AS user_id
  FROM mb_score_by_genre g
  WHERE g.parent_genre_id = ".$parent_genre_id."
  GROUP BY g.user_id
  ) hot_scores ON hot_scores.user_id = u.id
GROUP BY u.id
HAVING total_points >= 0
ORDER BY total_points DESC
LIMIT ".$max);

$q->addComponent('u', 'sfGuardUser u');
$q->addComponent('p', 'sfGuardUserProfile p');
$q->addComponent('b', 'mbStatsBosspoints b');
$q->addComponent('g', 'mbScoreByGenre g');

if ($execute)
{
   return $q->execute();
}
else // just return query for pager to setQuery
{
   return $q;
}

ただし、これを実行すると、次のエラーが発生しました。

SQLSTATE [42S22]: 列が見つかりません: 1054 不明な列 'total_points' が 'order 句' にあります。失敗したクエリ: "

SELECT COUNT(*) as num_results FROM (SELECT DISTINCT u.id FROM sf_guard_user u
LEFT JOIN sf_guard_user_profile p ON p.user_id = u.id
LEFT JOIN mb_stats_bosspoints b ON b.user_id = u.id AND b.date >= '2012-04-12' AND b.date <= '2012-04-18' AND b.parent_genre_id = 10
LEFT JOIN (SELECT SUM(g.score) AS hot_user_score, g.user_id AS user_id
FROM mb_score_by_genre g
WHERE g.parent_genre_id = 10
GROUP BY g.user_id
) hot_scores ON hot_scores.user_id = u.id
GROUP BY u.id
HAVING total_points >= 0
ORDER BY total_points DESC
LIMIT 10) as results"`

doctrine raw sqlクエリを使用している間にこれを修正する方法はありますか?

以下を使用して生のmysqlコードを実行するために提案された代替手段を試しました:

$doctrine = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
$q = $doctrine->query(".......");
if ($execute)
{
   return $q->execute();
}
else // just return query for pager to setQuery
{
   return $q;
}

しかし、ドクトリンクエリオブジェクトを返すためだけにそのメソッドを使用する方法がわからないため、次のエラーが発生します。

致命的なエラー: 未定義のメソッド PDOStatement::offset() の呼び出し

クエリを実行または返すためにクエリを作成する方法がわかりません。

したがって、2 つの質問は次のとおりです。2. そうでない場合、どうすれば純粋な mysql を使用し、依然として doctrine オブジェクトをハイドレートする doctrine クエリを作成できますか?

私は道に迷っており、正しい方向への製品が大好きです。どうもありがとう。

4

0 に答える 0