4

動的に生成された要素を含む大規模なクエリの一部として、左結合とカウントを行う必要があります。これは私が必要とするクエリです。

SELECT slug, name, count(client_tests.id) AS test_count
  FROM clients
  LEFT JOIN client_tests ON clients.id = client_tests.client_id
  GROUP BY clients.id;

結合クエリを作成しようとしましたが、以下に示すように、Lithium は結合が関係の一部であることを期待しているようです (関係は定義されていません) (現時点ではカウントを無視しています)。

$join = new Query(array(
  'source' => 'client_tests',
  'model' => '\app\models\ClientTest',
  'type' => 'LEFT',
  'constraint' => array('Client.id' => 'ClientTest.client_id'),
));
$clients = Client::all(array(
  'conditions' => $conditions,
  'group' => 'Client.id',
  'joins' => array($join)
));

これはNotice: Undefined index: ClientTest in /usr/local/www/oars/libraries/lithium/data/collection/RecordSet.php on line 340、関係に関連するコードのようです。

Client と ClientTest の間のリレーションシップを定義するhasManyと、左側の結合の構築が処理されますが、Client フィールドとカウントを取得する方法はありますか?

$clients = Client::all(array(
  'fields' => array('slug', 'name', 'count(ClientTest.test_id) as test_count'),
  'conditions' => $conditions,
  'group' => 'Client.id',
  'with' => 'ClientTest'
));

これにより、が発生( ! ) Notice: Undefined index: count(ClientTest in /usr/local/www/oars/libraries/lithium/data/source/Database.php on line 650するため、不可能であるか、間違った構文を使用しています。

でクエリを直接発行することもできますが、クエリClient::connection()->read($sql)には動的な要素があるため、とにかく SQL を作成する必要があります。

上記の方法を機能させる方法はありますか、それとも SQL を手動で作成する必要がありますか?

4

4 に答える 4

1

私があなたを正しく理解していれば、探している結果セットを返す SQL クエリが既にありますが、リチウムに問題があります。これを試してみることをお勧めします。SQL で必要なクエリのビューを作成する場合、代わりにリチウムがその単純な要求をビューに送信するようにすることができます。私はリチウムの経験はまったくありませんが、それが役立つことを願っています. 幸運を。

于 2012-07-26T14:15:17.760 に答える
0

テーブル名を単に入力し忘れたようですが、

'constraint' => array('Client.id' => 'ClientTest.client_id')

しかし、あなたは持っています:

LEFT JOIN client_tests ON clients.id = client_tests.client_id

client_testsとClientTestを間違えましたか?

于 2012-08-08T13:56:14.123 に答える
0

あなたのクエリは奇妙に思えます。これを試して:

SELECT slug, name, count(client_tests.id) AS test_count
FROM clients
LEFT JOIN client_tests ON clients.id = client_tests.client_id
GROUP BY clients.id;
于 2012-05-05T18:53:53.197 に答える