PHP db sorgudan sonuç nesne dönüş

2 Cevap

Ben sol kullanarak birden çok tablodan veri çekme bir sorgu üzerinde çalışıyorum bu gibi katılır:

 $query = "
     SELECT 
         users.name, 
         users.email,
         address.street,
         address.city,
         address.state,
         address.zip
    FROM users    
LEFT JOIN(
        SELECT 
            addresses.street, 
            addresses.city, 
            addresses.state, 
            addresses.zip, 
            `addresses.user_id `
        FROM addresses
)
AS address
ON users.id = `address.user_id`
WHERE users.id = 1";

$mysql = new mysql(HOST, USER, PASS, DBNAME);
$result = $mysql->query($query)->fetch_object();

Ben bu gibi sonuçlara erişebilirsiniz şimdi almak sonuçları:

   // get name
   $result->name;
   //get street address
   $result->street;

Sorgu sonunda bundan biraz daha karmaşık bir şey olacak beri. Bu gibi verilere erişmek mümkün olmak istiyorum:

// get user name
$result->user->name;

// get the street address
$result->address->street;

Bu tablo bazı benzer alanları adında beri, okumak için veri daha kolay vermenize yardımcı olacaktır.

Any help would be great thanks.


EDIT: (in response to Steve)

I am familiar with ORMs, and I'm currently using the Kohana framework. My interest is in cutting down on the actually number of queries run. The ORM in the Kohana framework calls a "SELECT *" for each table/model that you call. I'd prefer not to do that if I dont have to.

(Örnekte görüldüğü gibi) iki ayrı sorgu çalıştıran bir anlaşma büyük değil, ama benim gerçek örnekte ben yaklaşık 10 ayrı tablodan veri çekerek olacak, bu yüzden ziyade işlevselliği elde etmek için ayrı sorguları çalıştırmak istemiyorum i açıklayan oldu

2 Cevap

Yorumlarınız sorunuzu cevaplamak için burada ben hayal ediyorum sorgu var:

SELECT 
     users.name, users.email,
     addresses.street, addresses.city, addresses.state, addresses.zip
  FROM users    
  LEFT JOIN addresses
    ON users.id = addresses.user_id
  WHERE users.id = 1

Sub-select adresleri masanın çoğunu bir izdüşümü olduğundan, gereksiz görünüyor.

Ana soruya gelince, ben zarif ve non-hackish bir şey ile geliyor bir sabit zaman yaşıyorum. Aslında, akla geliyor tek şey düpedüz çirkin. Bu, örneğin, sorgudaki sütun adlarına önek ekleyebilirsiniz:

SELECT 
     users.name AS user_name, users.email AS user_email,
     addresses.street AS address_street, ...

Sütun adları kendinizi ayrıştırmak gerekiyor. Ben çok kötü olmaz herhalde. Gibi bir şey:

function rowToObject($row) {
    $obj = new StdClass();
    foreach ($row as $key => $val) {
        $keys = explode('_', $key);
        $o = $obj;
        for ($i=0; count($keys) > 1; ++$i) {
          $k = array_shift($keys);              
          if (! isset($o->{$k})) {
            $o->{$k} = new StdClass();
          }
          $o = $o->{$k};
        }
        $o->{$keys[0]} = $val;
    }
    return $obj;
}

...
$result = rowToObject($mysql->query($query)->fetch_assoc());

Ben belki tek yolu bazı ORM (Object Relational Mapper) kullanmak olacağını düşünüyorum. ORM kullanımı bu başka kullanışlı maddeleri getiriyor, ama bu düşük performansı katiyen için ödemek zorunda.

İyi PHP ORMS'nin örneğin vardır Doctrine veya Propel.