2013-05-20 7 views
10

में शामिल होने में खंड पर एकाधिक का उपयोग कैसे करें मैं इस एसक्यूएल को ज़ेंड फ्रेमवर्क एसक्यूएल पैटर्न में कर रहा हूं।ज़ेंड फ्रेमवर्क 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 

इस एसक्यूएल के लिए मैं पहले से ही Zend फ्रेमवर्क 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); 

के लिए इस कोड लिखने लेकिन ठीक से काम नहीं करता है और उसके नीचे की तरह एक संदेश देते हैं।

app.applyStatus = 1 

ढांचे 1 भागने है जैसे कि यह एक स्तंभ नाम, 1 थे:

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

उत्तर

15

मुद्दा यह हिस्सा है।

आप एक अभिव्यक्ति में इस हिस्से शामिल करनी भी

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

मुझे लगता है कि 'ऑन' में शामिल होने के विधि के पैरामीटर में भाव का उपयोग करते हैं, मुझे लगता है कि आप उपयोग कर रहे ZF2 के संस्करण पर निर्भर हो सकता इसे 2.1+

+0

धन्यवाद, एंड्रयू! – smozgur

0

जोड़ा गया था इससे सुरक्षा समस्या उत्पन्न होगी। Zf2 यह करने के लिए आपकी क्वेरी परिवर्तन:

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

यह सुरक्षा के मुद्दों के लिए प्रत्येक भाग के लिए

`

कहते हैं! new Expression का उपयोग करके आप इसे बाईपास कर रहे हैं और यदि आपको उपयोगकर्ता प्रविष्टि से applyStatus मिलते हैं, तो इसकी फ़िल्टरिंग के बारे में सुनिश्चित करें!

3

इस उत्तर पर बिल्डिंग।

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

अभिव्यक्ति निर्माता स्ट्रिंग, तो तर्क है, तो तर्क प्रकार स्वीकार करता है: आप भी अपनी मेज & स्तंभ पहचानकर्ता भाग निकले जा चाहते हैं, इस वाक्य रचना का उपयोग करें।

public function __construct($expression = '', $parameters = null, array $types = []) 
संबंधित मुद्दे