web-dev-qa-db-ja.com

PHP JDatabaseクエリを使用する関数

私はこれらの2つのブロック同一コードを私のPHPモジュールの1つに持っています。これら2つのブロックの唯一の違いは、最初のブロックでは... active = ' .$db->q('1'));および2番目のブロックで... active = ' .$db->q('0'));

これらの両方のブロックに共通のPHP function say subjectlist()を作成してから、引数_0_および_1_をそれぞれ渡して、コード。

のように、subjectlist(0);subjectlist(1);

最初のブロック

_<?php

// getting branch, semester and subject code of present classes of the teacher

$query1 = $db->getQuery(true);
$query1->select('sem,code')
->from('iust_teachers_classes')
->where('teacher = '. $db->q($user->username). 'and active = ' .$db->q('1'));

$db->setQuery($query1);
$sem_code = $db->loadObjectlist(); 

echo "<h3>List of present classes : </h3> <br>";

// Loop to populate the list of all present classes of the teacher

foreach ($sem_code as $rows) {

   $query2 = $db->getQuery(true);
   $query2->select('subject')
          ->from('iust_subjects')
          ->where('sem = '. $db->q($rows->sem). 'and code = ' .$db->q($rows->code));
   $db->setQuery($query2);
   $sub_list = $db->loadObjectlist();

    // echoing the active subject list

   foreach ($sub_list as $rows) {
        echo $rows->subject;
        echo "<br>";     
   }
}

?>
_

2番目のブロック

_<?php

// getting branch, semester and subject code of previous classes of the teacher

$query3 = $db->getQuery(true);
$query3->select('sem,code')
       ->from('iust_teachers_classes')
       ->where('teacher = '. $db->q($user->username). 'and active = ' .$db->q('0'));

$db->setQuery($query3);
$sem_code = $db->loadObjectlist();

echo "<h3>List of previous classes : </h3> <br>";

// Loop to populate the list of all previous classes of the teacher

foreach ($sem_code as $rows) {

    $query4 = $db->getQuery(true);
    $query4->select('subject')
           ->from('iust_subjects')
           ->where('sem = '. $db->q($rows->sem). 'and code = ' .$db->q($rows->code));
    $db->setQuery($query4);
    $sub_list = $db->loadObjectlist();

// echoing the previous subject list

    foreach ($sub_list as $rows) {
        echo $rows->subject;
        echo "<br>"; 
    }
}

?>
_

助けていただければ幸いです。

1
saibbyweb

クエリで結合を使用して2ではなく1クエリを使用できるように見えますが、次のようなものが必要だと思います。

function subjectlist($username,$active){

    $html = "";
    // getting branch, semester and subject code of present classes of the teacher
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('sem,code')
        ->from('iust_teachers_classes')
        ->where('teacher = '. $db->q($username). 'AND active = ' .$db->q($active));

    $db->setQuery($query);
    $sem_codes = $db->loadObjectlist(); 

    // Loop to populate the list of all present classes of the teacher
    foreach ($sem_codes as $sem_code) {
       $query = $db->getQuery(true);
       $query->select('subject')
              ->from('iust_subjects')
              ->where('sem = '. $db->q($sem_code->sem). 'AND code = ' .$db->q($sem_code->code));
       $db->setQuery($query);
       $sub_list = $db->loadObjectlist();

        // build the html to return
        $html .= "<h3>List of present classes : </h3> <br>";

        foreach ($sub_list as $sub_item) {
            $html .= $sub_item->subject . "<br>";
       }
       return $html;
    }
}

// best to pass the username to make the function more reusable
$username = JFactory::getUser()->username;
echo subjectlist($username,0); 
echo subjectlist($username,1);
1
jamesgarrett

拡張機能に属していると想定して、この関数をhelper.phpファイルに配置することをお勧めします。この場合は、例としてモジュールを使用します。

helper.php:

_class MyHelperFile
{
    public function subjectlist($active)
    {
        $db   = JFactory::getDbo();
        $user = JFactory::getUser();
        $html = '';

        $query = $db->getQuery(true);
        $query->select('sem, code')
              ->from($db->qn('iust_teachers_classes'))
              ->where($db->qn('teacher') . ' = ' . $db->q($user->username))
              ->where($db->qn('active') . ' = ' . (int)$active);
        $db->setQuery($query);
        $rows = $db->loadObjectlist(); 

        $html .= '<h3>List of present classes :</h3>';
        $html .= '<ul>';

        // Loop to populate the list of all present classes of the teacher
        foreach ($rows as $row)
        {
            $query = $db->getQuery(true);
            $query->clear();
            $query->select('subject')
                  ->from($db->qn('iust_subjects'))
                  ->where($db->qn('sem') . ' = ' . $db->q($row->sem))
                  ->where($db->qn('code') . ' = ' . $db->q($row->code));
            $db->setQuery($query);
            $rows = $db->loadObjectlist();

            // echoing the active subject list
            foreach ($rows as $row)
            {
                $html .= '<li>' . $row->subject . '</li>';
            }
        }
        $html .= '</ul>';

        return $html;
    }
}
_

mod_mymodule.php

_require_once dirname(__FILE__) . '/helper.php';

$helper = new MyHelperFile();
$subjectlist_0 = $helper->subjectlist(0);
$subjectlist_1 = $helper->subjectlist(1);
_

コードに示すように、パラメーターとして渡すのではなく、ユーザーオブジェクトを呼び出して関数内でユーザー名を取得することをお勧めします。

また、コードをいくつか改善しました。

もちろん、2番目のクエリをforeachループで実行するよりも、1つのクエリでjoin()句を使用する方がベターです。

1
Lodder

まあ、開発の段階では、ビルドするものを検討するのが遅いかもしれませんが、 JooYiiライブラリのモデル の特定のメソッドの実装を確認できます。

列の値を「条件」配列として渡すことにより、テーブルのクエリを生成する方法があります。

このクラスを使用すると、クエリを生成できるだけでなく、他の関数と一緒にページ分割を使用してリストを取得できます。

0
Alexandr