2013-05-20 3 views
10

Tôi đang làm như thế này sql vào khuôn khổ zend khuôn khổ zend.Cách sử dụng nhiều mệnh đề trong việc tham gia vào khung công tác zend 2

SELECT 
    jobs . *, 
    c.id AS cid, 
    c.name AS name, 
    c.companyImage AS companyImage, 
    c.logo AS logo, 
    count(app.userId) AS t_app, 
    app.applyStatus AS applyStatus, 
    app.userId AS appUserId 
FROM 
    jobs 
     LEFT JOIN 
    companies AS c ON jobs.companyName = c.id 
     LEFT JOIN 
    applicants AS app ON jobs.id = app.jobId AND app.applyStatus = 1 
WHERE 
    jobs.ownerId = 16 AND jobs.draftId != 0 
GROUP BY jobs.id 
ORDER BY jobs.id DESC 
LIMIT 3 

Đối với sql này tôi đã viết mã này cho zend framework 2

$adapter = $this->tableGateway->getAdapter(); 
     $sql  = new Sql($adapter); 

     $select = $sql->select(); 
     $select->from('jobs') 
       ->join(array('c' => 'companies'), 'jobs.companyName = c.id', array('cid' => 'id', 'name', 'companyImage', 'logo'), 'left') 
       ->join(array('app' => 'applicants'), ' jobs.id = app.jobId AND app.applyStatus = 1', array('t_app'  => new Expression('count(app.userId)'), 'applyStatus', 'appUserId' => 'userId'), 'left') 
       ->where("jobs.ownerId ={$userId} AND jobs.draftId != 0") 
       ->group('jobs.id') 
       ->order('jobs.id DESC') 
       ->limit(3); 

     $statement = $sql->getSqlStringForSqlObject($select); 
     $results = $adapter->query($statement, $adapter::QUERY_MODE_EXECUTE); 

nhưng không hoạt động đúng và nó đưa ra một thông báo như bên dưới.

SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'on clause' 

Trả lời

15

Vấn đề là phần này:

app.applyStatus = 1 

Khung được thoát 1 như thể nó là một tên cột, 1.

Bạn cần phải kèm theo phần này trong một Expression quá

new Expression('jobs.id = app.jobId AND app.applyStatus = 1') 

Tôi nghĩ rằng việc sử dụng các biểu thức vào trong 'ON' tham số của phương pháp tham gia có thể phụ thuộc vào phiên bản của ZF2 bạn đang sử dụng, tôi nghĩ nó đã được thêm 2.1+

+0

cảm ơn bạn, Andrew! – smozgur

0

Điều này sẽ tạo ra sự cố bảo mật. Zf2 thay đổi truy vấn của bạn như thế này:

Select * from tableA inner join tableB 
on `tableA`.`column` = `tableB`.`column` 
AND `tableB`.`column` = `1` 

Nó cho biết thêm

'

đến từng phần cho các vấn đề bảo mật! Bằng cách sử dụng new Expression bạn đang bỏ qua nó và nếu bạn nhận được applyStatus từ mục nhập của người dùng, hãy chắc chắn về việc lọc của nó!

3

Xây dựng dựa trên câu trả lời này. Nếu bạn cũng muốn bảng & định cột của bạn để được thoát, sử dụng cú pháp sau:

use Zend\Db\Sql\Expression; 

... 

$onExpression = new Expression('? = ? AND ? = ?', 
    ['jobs.id', 'app.jobId', 'app.applyStatus', 1], 
    [Expression::TYPE_IDENTIFIER, Expression::TYPE_IDENTIFIER, 
    Expression::TYPE_IDENTIFIER, Expression::TYPE_LITERAL] 
); 

$select->from('jobs') 
    ->join(array('app' => 'applicants'), $onExpression, array('t_app' => new Expression('count(app.userId)'), 'applyStatus', 'appUserId' => 'userId'), 'left'); 

Các nhà xây dựng biểu thức chấp nhận chuỗi, sau đó lập luận, sau đó loại đối số.

public function __construct($expression = '', $parameters = null, array $types = [])