2013-02-18 34 views
7

Tôi mới sử dụng Zend Framework 2. Tôi đã hoàn tất thành công hướng dẫn Album cho ZF2. Bây giờ tôi muốn hiển thị chỉ một dữ liệu nhất định từ nhiều bảng trong cơ sở dữ liệu. Tôi có một thiết lập cơ sở dữ liệu đơn giản với các bảng, ví dụ, người, sách, trạng thái..có. Nó thực sự không quan trọng những gì cơ sở dữ liệu của nghĩa vụ phải làm. Những gì tôi muốn biết là nếu có một hướng dẫn sẽ chỉ cho tôi hướng dẫn từng bước để hiển thị dữ liệu từ các kết nối bảng. Tôi đã thấy các đoạn mã hiển thị cách tham gia, nhưng tôi chưa tìm thấy bất kỳ hướng dẫn nào về cách thiết lập các lớp và cách cấu hình Module.php. Nói cách khác, Module trong Album có một tên bảng được mã hóa cứng trong getServiceConfig(). Nhưng làm thế nào để tôi thiết lập nó để nó biết tôi đang yêu cầu dữ liệu từ nhiều bảng. Ngoài ra, nếu tôi muốn thiết lập mối quan hệ, tôi vẫn tạo lớp cho các bảng cơ sở dữ liệu như trong hướng dẫn Album hay nó sẽ khác. Bạn có thể vui lòng giúp đỡ, hoặc chỉ cho tôi con đường đúng không? Nếu bạn biết về bất kỳ hướng dẫn nào giải thích việc xử lý nhiều bảng, điều đó sẽ rất tuyệt vời.nhiều bảng cho Zend Framework 2

Trả lời

5

Hướng dẫn về ablums sử dụng Zend\Db\TableGateway không hỗ trợ kết nối với nhiều bảng.

Bạn cần sử dụng trực tiếp Zend\Db hoặc thông qua lớp người lập bản đồ, chẳng hạn như AbstractDbMapper trong mô-đun ZfcBase.

Việc sử dụng cơ bản như sau:

<?php 

// Given that $dbAdapter is an instance of Zend\Db\Adapter\Adapter 

use Zend\Db\Sql\Select(); 
use Zend\Db\ResultSet\ResultSet(); 

$select = new Select(); 
$select->from('album') 
    ->columns(array('album.*', 'a_name' => 'artist.name')) 
    ->join('artist', 'album.artist_id' = 'artist.id'); 

$statement = $dbAdapter->createStatement(); 
$select->prepareStatement($dbAdapter, $statement); 
$driverResult = $statment->execute(); 

$resultset = new ResultSet(); 
$resultset->initialize($driverResult); // can use setDataSource() for older ZF2 versions. 

foreach ($resultset as $row) { 
     // $row is an ArrayObject 
} 

Phương pháp join() được sử dụng để thực hiện tham gia giữa các bảng albumartist. Chúng tôi cũng sử dụng columns() để chọn cột nào được trả lại. Trong trường hợp này, tôi tạo một bí danh được gọi là a_name cho cột name trong bảng nghệ sĩ.

Khi đối tượng Select được thiết lập, thì phần còn lại là mã Db tiêu chuẩn sẽ trả lại đối tượng ResultSet cho bạn chứa dữ liệu.

+0

Cảm ơn Rob. Tôi sẽ cho nó một viên đạn. Trong khi đó, bạn có biết bất kỳ hướng dẫn làm việc nào sử dụng Zend \ Db hay không. Vì tôi mới làm quen với Zend, tôi sẽ mất một thời gian để hiểu đầy đủ. Sẽ rất hữu ích nếu tôi có thể xem hướng dẫn, nơi họ đã sử dụng Zend \ Db để truy xuất dữ liệu và hiển thị chúng. Tuy nhiên, cảm ơn bạn đã giúp đỡ của bạn. – user1828605

+0

Rob, vài điều vẫn chưa rõ ràng với tôi. Tôi có tạo các lớp cho mỗi bảng mà tôi có không? Tôi phải làm gì trong Module.php. Hiện tại tôi có hàm getServiceConfig() trong hàm Module như được hiển thị trong hướng dẫn Album. Tôi hiểu những gì bạn đã trình bày ở trên, nhưng vấn đề hiện tại của tôi là tôi không biết bắt đầu nói chuyện với cơ sở dữ liệu như thế nào. Một hướng dẫn sẽ cực kỳ hữu ích. Cảm ơn – user1828605

+0

Tôi tạo các lớp cho từng thực thể lô-gic - thường là ánh xạ tới một hàng trong bảng, nhưng không phải lúc nào (đôi khi người lập bản đồ luôn tham gia). Tôi sẽ thử và sắp xếp một số mã trên Github. –

4

Chỉ cần mở rộng trên Robs câu trả lời xuất sắc, nó đơn giản để đưa nó một bước xa hơn và cư trú nhiều đối tượng để tạo mối quan hệ bạn yêu cầu.

<?php 

// Given that $dbAdapter is an instance of Zend\Db\Adapter\Adapter 

use Zend\Db\Sql\Select(); 
use Zend\Db\ResultSet\ResultSet(); 

$select = new Select(); 
$select->from('album') 
    ->columns(array('album.*', 'artist.*')) 
    ->join('artist', 'album.artist_id' = 'artist.artist_id'); 

$statement = $dbAdapter->createStatement(); 
$select->prepareStatement($dbAdapter, $statement); 
$driverResult = $statement->execute(); // execute statement to get result 

$resultset = new ResultSet(); 
$resultset->setDataSource($driverResult); 

$albumHydrator = new AlbumHydrator; 
$artistHydrator = new ArtistHydrator; 

foreach($resultset as $row) { // $row is an ArrayObject 
    $album = $albumHydrator->hydrate($row); 
    $artist = $artistHydrator->hydrate($row); 
    $album->setArtist($artist); 
} 

Bạn cũng nên nhìn vào kết quả dưỡng ẩm bộ để xây dựng đối tượng của bạn cho bạn trực tiếp từ ResultSet:

http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.html

0
use Zend\Db\Sql\Select; 
$select = new Select(); 
// or, to produce a $select bound to a specific table 
// $select = new Select('foo'); 

$select->join(
    'foo' // table name, 
    'id = bar.id', // expression to join on (will be quoted by platform object before insertion), 
    array('bar', 'baz'), // (optional) list of columns, same requiremetns as columns() above 
    $select::JOIN_OUTER // (optional), one of inner, outer, left, right also represtned by constants in the API 
); 

$select->from(array('f' => 'foo')) // base table 
    ->join(array('b' => 'bar'),  // join table with alias 
    'f.foo_id = b.foo_id');   // join expression 
Các vấn đề liên quan