2012-03-26 27 views
4

これは簡単なことですが、1.5から1.6/1.7/2.5の切り替えでは、良いソースを見つけることができませんでした。Joomlaでクエリを構築するさまざまな方法は?

コンポーネントをビルドしたり、その他の問題の中でも、構文の問題が続いています。

例えば、ここで私は、クエリを構築しています一つの方法です: [TYPE 1]

$query->SELECT('u.id as UserID 
    , u.name AS Name 
    , uppi.profile_value AS Hair 
    , uppi2.profile_value AS Height 
    '); 
$query->FROM (' #__users AS u'); 
$query->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 '); 
$query->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 '); 
$query->GROUPBY (' u.id 
    , u.name 
    , uppi.profile_value 
    '); 

別の方法: [TYPE 2]

$query->SELECT('u.id as UserID 
    , u.name AS Name 
    , uppi.profile_value AS Hair 
    , uppi2.profile_value AS Height 
    ') 
->FROM (' #__users AS u') 
->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ') 
->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ') 
->GROUPBY (' u.id 
    , u.name 
    , uppi.profile_value 
    '); 

一部を混乱しますどちらも、 "LEFTJOIN"のようなmysql呼び出しは2つではなく1つの単語です。だから私が使用したい場合はINSERT…ON DUPLICATE KEY UPDATE私は完全に失われています。 [TYPE 3]

$query->SELECT('u.id as UserID 
    , u.name AS Name 
    , uppi.profile_value AS Hair 
    , uppi2.profile_value AS Height 
    '); 
$query->FROM (' #__users AS u'); 
$query->JOIN ('LEFT', ' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 '); 
$query->JOIN ('LEFT', ' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 '); 
$query->GROUPBY (' u.id 
    , u.name 
    , uppi.profile_value 
    '); 
$query->ORDER ('u.name ASC'); 

これは私がクエリが構築された見てきた別の方法ですが、仕事を得ることができない[EDITED - 今働いて、感謝@cppl:ここ

は、第三のです!] [タイプ4]

$query= "SELECT `u`.`id` as UserID 
    , `u`.`name` AS Name 
    , `uppi`.`profile_value` AS Hair 
    , `uppi2`.`profile_value` AS Height 
FROM `#__users` AS u 
LEFT JOIN `#__user_profiles` AS uppi ON `u`.`id` = `uppi`.`user_id` AND `uppi`.`ordering` = 1 
LEFT JOIN `#__user_profiles` AS uppi2 ON `u`.`id` = `uppi2`.`user_id` AND `uppi2`.`ordering` = 2 
    "; 

私は、n ... JoomlaのMVCのチュートリアルとリンダを通じて行ってきましたどちらか一方が本当にこれを "ここではいくつかのコードPLOP"を超えて扱っています。

References: 
    --//www.theartofjoomla.com/home/9-developer/135-database-upgrades-in-joomla-16.html 
    --//stackoverflow.com/questions/8467858/joomla-1-7-db-query-does-not-work-when-query-has-an-ampersand 
    --developer.joomla.org/standards/ch03s10.html 
    --forum.joomla.org/viewtopic.php?p=2506722 
    --forum.joomla.org/viewtopic.php?p=1200668 
    --docs.joomla.org/API16:JDatabaseQuery 
    --//fsadventures.com/2011/01/some-basic-joomla-database-call-functions/ 
    --//www.sourcecodester.com/php/3863/updating-multiple-rows-mysql-using-php.html 
    --//stackoverflow.com/questions/7047471/mysql-query-syntax-error 

質問:

1)は、これらの間に違いはありますか?

2)ある方法を別の方法で使用する理由はありますか?

3)これらを構築するさまざまな方法を学習するための優れた情報源はありますか?私は何時間も捜してきましたが、包括的なものは何も見つかりませんでした。

ありがとうございます!

+0

一般的に私は '二重キー更新 'を使用しないでください。私は、クエリを試して、例外/エラーを生成して、そのエラーを2番目のクエリで処理する方が好きです。私は非常に少数の異なるORMとDBAL層を使用していますが、そのAPIの機能をサポートしていない人は、通常、それを達成するためにどのような未処理のSQL機能にも戻さなければなりません。 – prodigitalson

+0

ああ、良い点!私が今働いていることは他の場所で決して使われることはありませんが、それは間違いなく私が勉強しているうちに私が守ることです。ありがとう! – Gisto

答えて

2
  1. あなたのタイプ1,2 & 3タイプ4は、SQL文字列にクエリを設定するには、古いスタイルを使用しているのに対し、新しいJDatabaseQueryオブジェクトを使用しています。
  2. タイプ4が動作しない場合は、SQLエラーが発生しますか? (Joomlaのデバッグモードを有効にして、アプリケーションのプロファイルでSQLエラーをダンプすることができますか?)
  3. JDatabaseQueryは、MySQLだけでなく複数のSQLデータベースをサポートするために必要な抽象化を提供するために使用されます。 select()where()join()、等...
  4. のような機能が->leftJoin()leftJoin()をJDatabaseQuery機能へのPHPの呼び出しと呼ばれ、したがって、一つの単語すなわちなければならないことに注意してください。 2つにすることはできません。
  5. leftJoin()実際にはjoin('LEFT',$conditions)が呼び出されるだけで、機能的な違いよりも読みやすくなっています。
  6. したがって、タイプ1,2 & 3は事実上同じですが、読みやすさの程度が異なっています(たとえば、IMHOタイプ2 & 3はタイプ1よりも読み込みと保守が難しい)。

あなたはJoomla!のすべてのオンラインソースを見つけたようです。ドキュメント、Joomla! Googleグループ(CMS DevGeneral Dev、およびPlatform Dev)。

唯一の他の情報源はAndrew Eddies "Learn the Art of Joomla!"です。私はアンドリューのものを自分で使ったことはありませんが、最後のJoomla!私が出席した日。

編集 エラーに基づいて、私はあなたが1つの識別子として包まれた識別子u.idを持っているからだと言うでしょう。

SELECT `u`.`id` AS "UserID" FROM `#__users` AS `u` 
+0

これは素晴らしいです - ありがとうございます! – Gisto

+0

2) - デバッガは "JDatabaseMySQLi :: query:1054 - 'フィールドリスト'の 'u.id'列が不明です。私はおそらく、「または」の権利を持っていないでしょう - いくつかのバリエーションを見て、何が正しいのか分かりませんでした。しかし、それが時代遅れなら私はそれについても心配しません。 – Gisto

+0

ああ、私の編集を参照してください。 – Craig

関連する問題