Především je to quote
ne Quote
.Zadruhé byste měli použít quoteName()
pro názvy polí. Za třetí, není důvod přestat používat API jen proto, že máte poddotaz. Také váš kód je velmi matoucí ohledně toho, co je název pole a která hodnota. Předpokládám, že $sf_value
představuje hodnotu, kterou se pokoušíte porovnat, a adcfvc.field
je název pole, ve kterém jsou uložena data, která se pokoušíte porovnat.
Nahradit
AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value
s
AND ' . $db->quoteName( 'adcfvc.field_value' ) . ' LIKE ' . $db->quote('%' . JString::strtolower($sf_value) . '%')
Nejsem si jistý, proč tam používáte JString, ale pokud máte pocit, že je to nutné, pak v pořádku.
Zde je váš dílčí dotaz
SELECT adcfvc.advert_id
FROM #__koparent_advert_specific_fields_values AS adcfvc
WHERE adcfvc.advert_id = p.id
AND adcfvc.field_name = ' . $db->Quote($sf_key) . '
AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value
Takže vy, protože máte $db
již.
$subquery = $db->getQuery(true);
// Assuming p.id is an integer
$subquery->where($db->quoteName(adcfvc.advert_id) = p.id)
//Assuming $sf_key is an integer
->where($db->quoteName(adcfvc.field_name) . ' = ' . $sf_key)
->where($db->quoteName(adcfvc.field_value) . ' LIKE '
. $db->Quote('%'. JString::strtolower($sf_value) . '%')) ;
Pak v dotazu nejvyšší úrovně, jehož jednu část jste nám právě ukázali, něco jako
$query->where('p.id IN (' . $subquery . ')' );