Drupal 7 db_select ()의 조건부에서 SQL 함수 사용


9

열에 대한 변수를 소문자로 비교하도록 강제하는 조건을 SQL WHERE 절에 쓰려고합니다. 그러나 addExpression 함수는 where 절이 아닌 필드 선택에 표현식을 넣기 때문에이를 수행하지 못합니다.

내가 시도한 것은 다음과 같습니다.

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$query->addExpression("LOWER(ttd.name) = $category");
$result = $query->condition('machine_name', 'images_cat', '=')
    ->execute()
    ->fetchAssoc();

이:

$category = 'mobile wifi';
$query = db_select('taxonomy_term_data', 'ttd')
    ->fields('ttd', array('tid'));
$query->innerJoin('taxonomy_vocabulary', 'tv', 'ttd.vid = tv.vid');
$result = $query->condition('machine_name', 'images_cat', '=')
    ->condition('LOWER(ttd.name)', $category, '=')
    ->execute()
    ->fetchAssoc();

두 번째 것은 유효하지 않으며 첫 번째 것은 위에서 언급 한 문제를 일으 킵니다. 어떤 생각이나 제안?

고마워, 패트릭

답변:


15

변화

$query->addExpression("LOWER(ttd.name) = $category");

$query->where('LOWER(ttd.name) = :category', array(':category' => $category));

작동합니다. 심지어 그렇게하지 않았습니다.
패트릭

3

LOWER()MySQL에서는 사용 이 느리다고 간주됩니다. LIKEDrupal의 데이터베이스 API (DBTNG)는 적어도 MySQL 테이블이 * _ci 데이터 정렬 중 하나를 사용하도록 구성된 경우 대소 문자를 구분하지 않기 때문에 필요하지 않습니다 . 표준 MySQL 설치는 * utf8_general_ci *를 사용하므로 Drupal도 마찬가지입니다.

따라서 LIKE 조건을 사용해야합니다.

$query->condition('name', $category, 'LIKE');

포괄적 인 설명은 조건절 을 참조하십시오 .

BTW : DBTNG 기반 데이터베이스 드라이버는 대소 문자를 구분하지 않는 LIKE를 구현합니다. 예를 들어 PostgreSQL은 include / database / pgsql / database.inc 에서 처리되는 LIKE 대신 ILIKE를 사용 합니다 .


1

addExpression을 계속 사용할 수 있습니다.

// Functions - You can use sql functions using addExpression ($expression, $alias = NULL, $arguments = array()).
$query->addExpression('MIN(o.tid)', 'min_term_id');

리소스 : Drupal 7의 SQL 쿼리 예제

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.