En primer lugar, es quote
no Quote
.En segundo lugar, debe usar quoteName()
para los nombres de los campos. En tercer lugar, no hay razón para dejar de usar la API solo porque tiene una subconsulta. Además, su código es muy confuso sobre cuál es el nombre del campo y cuál es el valor. Supongo que $sf_value
representa el valor que está tratando de hacer coincidir y adcfvc.field
es el nombre del campo que almacena los datos que está tratando de hacer coincidir.
Reemplazar
AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value
con
AND ' . $db->quoteName( 'adcfvc.field_value' ) . ' LIKE ' . $db->quote('%' . JString::strtolower($sf_value) . '%')
No estoy seguro de por qué estás usando JString allí, pero si crees que es necesario, está bien.
Aquí está su subconsulta
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
Así que ya tienes $db
ya.
$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) . '%')) ;
Luego, en la consulta de nivel superior, de la que acaba de mostrarnos una parte, algo como
$query->where('p.id IN (' . $subquery . ')' );