2013-03-04 45 views
8

Hãy nói rằng tôi có 2 đối tượng php:PDO FETCH_CLASS với các bảng tham gia

<?php 
class Post { 
    public $id; 
    public $text; 
    public $user_id; 
} 
?> 

<?php 
class User { 
    public $id 
    public $name 
} 
?> 

Mỗi bài có một hạn chế duy nhất với 1 người dùng trong cơ sở dữ liệu.

Tôi muốn điền dữ liệu vào "Bài đăng" -object với phương pháp "FETCH_CLASS" của PDO hoạt động cho tất cả thuộc tính "Bài đăng" nhưng làm cách nào để điền vào các thuộc tính trong "Người dùng"?

SQL tuyên bố của tôi trông như thế này:

SELECT post.id, 
     post.text, 
     post.user_id, 
     user.id, 
     user.name 
FROM POST INNER JOIN User on post.user_id = user.id 

Cảm ơn!

UPDATE:

ATM tôi điền vào tôi "Post" đẳng cấp như thế này:

$statement = $db -> prepare($query); 
    $statement -> execute(); 
    $statement -> setFetchMode(PDO::FETCH_CLASS, 'Post'); 
    $posts = $statement -> fetchAll(); 

Vậy làm thế nào tôi sẽ phải thay đổi điều đó cho cũng lấp đầy lớp khác "Thành viên"?

SOLUTION:

$statement = $db -> prepare($query); 
$statement -> execute(); 
$posts = array(); 
while (($row = $statement->fetch(PDO::FETCH_ASSOC)) !== false) { 
    $post   = new Post(); 
    $post->id  = $row['post_id']; 
    $post->text  = $row['post_text']; 
    $post->created = $row['post_created']; 
    $post->image = $row['post_image']; 
    $post->url  = $row['post_url']; 
    $post->weight = $row['post_weight']; 
    $post->likes = $row['post_likes']; 
    $user   = new User(); 
    $user->id  = $row['user_id']; 
    $user->nickname = $row['user_nickname']; 
    $user->created= $row['user_created']; 
    $user->locked = $row['user_locked']; 
    $post->user  = $user; 
    $posts[] = $post; 
} 
return $posts; 
+0

câu hỏi của bạn đã giúp ích rất nhiều! cảm ơn bạn! –

Trả lời

2

Theres không hỗ trợ trực tiếp trong PDO như xa như tôi biết. Thông thường, nếu bạn cần tạo một biểu đồ đối tượng phức tạp từ kết quả của truy vấn, đó là trách nhiệm của ORM.

Nếu bạn cần chức năng này, tôi khuyên bạn nên sử dụng Doctrine hoặc Propel trái ngược với việc tự viết nội dung nào đó. Có những người khác cũng có thể có trọng lượng nhẹ hơn, nhưng tôi không có kinh nghiệm với họ.

EDIT:

Tôi nghĩ có lẽ tôi hiểu lầm câu hỏi như im chắc chắn những người khác có thể. Tôi nghĩ câu hỏi thực sự là làm thế nào để có được quyền truy cập vào các cột đã tham gia, chứ không phải là cách để tạo một đối tượng từ chúng.

Trong trường hợp đó, chỉ cần sử dụng phương pháp areth fethc tiêu chuẩn như PDO::FETCH_ASSOC, PDO::FETCH_NUMERIC hoặc PDO::FETCH_BOTH sẽ cung cấp cho bạn tất cả các cột bạn truy vấn.

Vì vậy, nếu bạn muốn biến điều đó thành "biểu đồ đối tượng", bạn phải thực hiện thủ công không bằng cách sử dụng PDO::FETCH_CLASS.

Ví dụ:

//$db is pdo: 
// also notice im aliase the columns prefixing the name so that we can tell what belongs to 
// post and what belongs to user, an alternative approach would be to use FETCH_NUMERIC, 
// which just uses the column positions from the seelct statement as the keys 
// so in this case post.id would be in the array as key 0, and user.name would be in the 
// array as key 4 
$stmt = $db->prepare('SELECT post.id as p_id, 
     post.text as p_text, 
     post.user_id as p_user_id, 
     user.id as u_id, 
     user.name as u_name 
FROM POST INNER JOIN User on post.user_id = user.id'); 

$stmt->execute(); 

while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) { 
    print_r($row); 
    /* will output: 
     Array (
     'p_id' => 'value' 
     'p_text' => 'value' 
     'p_user_id' => 'value' 
     'u_id' => 'value', 
     'u_name' => 'value' 
    ) 
    So now you need to decide how to create your objects with the information returned 
    */ 
} 
+0

cảm ơn.ATM Tôi nghĩ tôi nên tránh xa PDO nếu điều này quá phức tạp. Ứng dụng nào thậm chí còn tồn tại mà không cần tham gia đơn giản? –

+0

Tôi không hiểu những gì phức tạp như vậy về nó đặc biệt là xem xét lựa chọn duy nhất khác là 'mysqli' đó là khó khăn hơn để làm việc với và tiết hơn. Không hỗ trợ "hydrating" một mối quan hệ phức tạp từ một kết quả truy vấn tham gia. – prodigitalson

+0

Tôi không chắc chắn nếu tôi hiểu bình luận của bạn một cách chính xác. Bạn có đồng ý rằng PDO nên hỗ trợ điều đó không? Nó có hỗ trợ nó khi không sử dụng FETCH_CLASS không? Tôi sẽ xem xét điều đó ngay bây giờ ... –

1

Không thực sự là một phản ứng đối với OQ, nhưng vì nó giữ popping trên Google (có tôi biết nó hơn một năm tuổi). Bạn sẽ thấy rằng nó nhanh hơn rất nhiều chỉ để bỏ qua các vòng lặp và truy vấn từng bảng một cách riêng biệt.

 

    SELECT post.id, 
      post.text, 
      post.user_id, 
    FROM POST INNER JOIN User on post.user_id = user.id 
     $statement = $db -> prepare($query); 
     $statement -> execute(); 
     $statement -> setFetchMode(PDO::FETCH_CLASS, 'Post'); 
     $posts = $statement -> fetchAll(); 

    SELECT user.id, 
      user.name 
    FROM POST INNER JOIN User on post.user_id = user.id 
     $statement = $db -> prepare($query); 
     $statement -> execute(); 
     $statement -> setFetchMode(PDO::FETCH_CLASS, 'User'); 
     $users = $statement -> fetchAll(); 
0

Có thể sử dụng PDO :: FETCH_NAMED nếu bạn làm việc nhiều bảng. Hoặc sử dụng PDO :: ATTR_FETCH_TABLE_NAMES.

Các vấn đề liên quan