2013-05-20 8 views
10

Robię tak jak ten sql w zend Framework sql pattern.Jak używać wielu na klauzuli przy dołączaniu w Zend Framework 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 

Z tego sql już napisać kod dla 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); 

ale nie działa prawidłowo, a jej dać komunikat jak poniżej.

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

Odpowiedz

15

Problemem jest to część:

app.applyStatus = 1 

Ramy ucieka 1 tak, jakby to była nazwa kolumny, 1.

Trzeba załączyć tę część w wyrażeniu zbyt

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

myślę użycia wyrażeń w parametrze „On” sposobu przyłączenia może zależeć od wersji ZF2 używasz, myślę został dodany 2.1+

+0

dziękuję, Andrew! – smozgur

0

Spowoduje to problem bezpieczeństwa. ZF2 zmienia zapytanie do tego:

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

Dodaje

`

do każdej części do spraw zabezpieczenia! Korzystając z numeru new Expression, omijasz go i jeśli otrzymasz applyStatus z wpisu użytkownika, upewnij się, że jest on filtrowany!

3

Opierając się na tej odpowiedzi. Jeśli też chcesz tabeli & identyfikatory kolumn być uciekł, użyj składni:

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'); 

Konstruktor Expression akceptuje ciąg, a następnie argumentów następnie typy argumentów.

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