11

この質問は、Mysql results in PHP - arrays or objects? に似ています。しかし、私の質問は、そこで議論されていることを拡張しています。

データベースの結果を操作するのにどちらの形式が適しているかを判断しようとしています:オブジェクトまたは配列。私はパフォーマンスについて心配していません (私が理解していることから、ほとんど違いはありません)。また、結果を作成、更新、または削除するのではなく、結果を表示することに重点を置いています。

今日まで、私は常にmysqli_fetch_objectや PDO のような関数を介してオブジェクトを使用してきましたfetchObject。結合を開始するまで、これは通常うまく機能します。結合は、2 つ以上のテーブルからのフィールドのブレンドである奇妙なオブジェクトにつながります。私のコードはすぐに混乱し始めます。

私は特定のクラス名を割り当てており、デフォルトに固執していないことに注意してくださいstdClass。これは、自分のクラスで作成したヘルパー メソッドにアクセスできるようにするためです。例えば:

foreach ($members as $member)
{
    echo $member->full_name();
    echo $member->age();
}

わかりやすくするために、すべてのデータベース結果を配列に移行することを検討しています。私が読んだことから、他の人もこれを行っています。ただし、これにより、ヘルパー メソッドに簡単にアクセスする方法がなくなります。

full_name()上記の例を使用すると、大したことではなく、メソッドを使用する代わりに姓と名の両方を出力できたと思います。age() メソッドに関しては、一般的なユーティリティ クラスを作成してそこに配置できると思います。

私の質問:

  1. (モデル) オブジェクトを使用する場合、結合をどのように処理しますか?
  2. 配列を使用する場合、ヘルパー メソッドをどのように処理しますか?
4

4 に答える 4

7

私は常にオブジェクトを使用してきましたが、クエリから直接データを入力することはしません。「set」関数を使用してレイアウトを作成し、結合や名前の衝突の問題を回避します。「full_name」の例の場合、おそらく「as」を使用して名前の部分を取得し、それぞれをオブジェクトに設定し、「get_full_name」をメンバー fn として提供します。

野心的な気分なら、あらゆる種類のものを 'get_age' に追加できます。生年月日を一度設定して、そこからワイルドに。

編集: データからオブジェクトを作成する方法はいくつかあります。クラスを事前に定義してオブジェクトを作成することも、「その場で」作成することもできます。

--> いくつかの単純化された例 -- これで十分でない場合は、さらに追加できます。

急いで:

$conn = DBConnection::_getSubjectsDB();  
$query = "select * from studies where Status = 1";  
$st = $conn->prepare( $query );  

$st->execute();  
$rows = $st->fetchAll();  
foreach ( $rows as $row )  
{  
    $study = (object)array();  
    $study->StudyId = $row[ 'StudyId' ];  
    $study->Name = $row[ 'StudyName' ];  
    $study->Investigator = $row[ 'Investigator' ];  
    $study->StartDate = $row[ 'StartDate' ];  
    $study->EndDate = $row[ 'EndDate' ];  
    $study->IRB = $row[ 'IRB' ];  

    array_push( $ret, $study );  
} 

定義済み:

/** Single location info
*/
class Location  
{  
    /** Name  
    * @var string  
    */  
    public $Name;  

    /** Address  
    * @var string  
    */  
    public $Address;  

    /** City  
    * @var string  
    */  
    public $City;

    /** State
    * @var string
    */
    public $State;

    /** Zip
    * @var string
    */
    public $Zip;

    /** getMailing
    * Get a 'mailing label' style output
    */
    function getMailing()
    {  
         return $Name . "\n" . $Address . "\n" . $City . "," . $State . "  " . $Zip;
    }
}

利用方法:

$conn = DBConnection::_getLocationsDB();  
$query = "select * from Locations where Status = 1";  
$st = $conn->prepare( $query );  

$st->execute();  
$rows = $st->fetchAll();  
foreach ( $rows as $row )  
{  
    $location = new Location();  
    $location->Name= $row[ 'Name' ];  
    $location->Address = $row[ 'Address ' ];  
    $location->City = $row[ 'City' ];  
    $location->State = $row[ 'State ' ];  
    $location->Zip = $row[ 'Zip ' ];  

    array_push( $ret, $location );  
} 

その後、$ret をループして宛名ラベルを出力できます。

foreach( $ret as $location )
{ 
    echo $location->getMailing();
}
于 2013-03-04T15:56:51.757 に答える
1

すべてのデータとそのタイプをモデルの形式で表す方がよいと思います。結合されたオブジェクトと単一のオブジェクトの両方。そうすることで、常に問題が回避されます。

class Member_Details {
    public $id;    
    public $first_name;
    public $last_name;

    public function FullName() {
         return $this -> first_name." ".$this -> last_name;
    }
}

class Member_Address {
    public $id;
    public $address;
    public $city;
}

class MemberJoins {
     public $objects = array();
}

このようなクラスを作成した後、次の方法でJOINを構成できます。

$obj_details = new Member_Details();
$obj_address = new Member_Address();
//Add data to the objects and then

//Then create the join object
$obj_address_details = new MemberJoins();
$obj_address_details -> objects = array($obj_details, $obj_address);

idこれらは両方とも、データをリンクできる共通のプロパティを持っています。

于 2013-03-04T16:56:06.200 に答える
1

結局のところ好みです。個人的にはオブジェクトの方が好きです。ただし、CakePHP は配列キーとして「オブジェクト」名を使用して、結果に配列を使用します。しかし、CakePHP で関連するレコードを取得すると、おかしくなり始めます。

あなたの問題では、単にオブジェクト内にオブジェクトを持つことができます。例えば:

stdClass Object
(
    [id] => 1
    [title] => Article Title
    [published] => 2013-03-04 16:30:00
    [category] => stdClass Object
        (
            [id] => 1
            [name] => Category Name
        )

)

次に、関連するデータを次のようにビューに表示できます。

<?php echo $article->category->name; ?>

または、ゲッターとセッターを使用する場合:

<?php echo $article->getCategory()->getName(); ?>

正解も不正解もありません。私が言うように、それはすべて個人的な好みです。

于 2013-03-04T16:32:15.163 に答える
0

2 つ以上のテーブルで SELECT を使用して出てくる奇妙なオブジェクトについて話していると思います。

これを解決するASには、SQL で を使用して、より単純な名前を付けます。

SELECT IFNULL(SUM(table2.big_name),0) AS sumBig

...


$result=$PDO->fetchObject();
$sum=$result->sumBig;
于 2013-01-02T23:40:09.343 に答える