Przede wszystkim jest to quote
nie Quote
. Po drugie, powinieneś użyć quoteName()
dla nazw pól. Po trzecie, nie ma powodu, aby przestać używać API tylko dlatego, że masz podzapytanie. Również twój kod jest bardzo mylący, jeśli chodzi o to, która jest nazwą pola, a która jest wartością. Zakładam, że $sf_value
reprezentuje wartość, którą próbujesz dopasować i adcfvc.field
to nazwa pola, które przechowuje dane, które próbujesz dopasować.
Zastąp
AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value
z
AND ' . $db->quoteName( 'adcfvc.field_value' ) . ' LIKE ' . $db->quote('%' . JString::strtolower($sf_value) . '%')
Nie jestem pewien, dlaczego używasz tam JString, ale jeśli uważasz, że jest to konieczne, w porządku.
Oto Twoje podzapytanie
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
Więc ty, ponieważ masz $db
już.
$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) . '%')) ;
Następnie w zapytaniu najwyższego poziomu, którego właśnie pokazałeś nam jedną część, coś takiego jak
$query->where('p.id IN (' . $subquery . ')' );