db_select () 쿼리에서 LIKE 조건을 어떻게 작성합니까?


14

쿼리 LIKE에서 조건을 어떻게 작성합니까 db_select()?

db_query()API 호출 로이 작업을 수행하는 방법을 알고 있지만이 작업을 수행하는 특수 구문 / 방법이 db_select()있습니까?


2
나중에 참조 할 수 있도록 인수 자리 표시 자로 전달할 수있는 모든 것을 db_query인수로 전달할 수도 있습니다 ...Query::condition. 서로 다른 유형의 쿼리마다 개별 연산자에 대한 설명서를 찾지 못할 것입니다. 모든 것이 하루가 끝날 때 PDO를 거치며 db_like, 변수를 올바르게 준비하면 db_query정의에 따라 동일한 변수를 올바르게 준비합니다.db_select
Clive

2
db_select + LIKE에 대한 질문을 찾을 수 없다면 누군가가 그것을 제안하기 전에 우리는 이것에 대해 생각하지 않습니다. 우리는 db_query + LIKE를 가지고 있지만 대답은 동일하지만 질문은 다릅니다.
mpdonadio

답변:


21

Drupal Documentation을 파고 들자 db_like API documentation page 및 SelectQuery : condition handler doc page 에서 솔루션을 찾았습니다 .

예를 들어

$result = db_select('field_data_field_name', 'f')->fields('f', array(
    'entity_id',
    'field_name_value'
))
->condition('entity_type', 'user')
->condition('bundle', 'user')
->condition('deleted', 0)
->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')
->distinct()
->range(0, 10)
->execute();

같은 쿼리에 사용할 조건은

->condition('field_name_value', '%' . db_like($last_item) . '%', 'LIKE')

2
여기서 주목해야 할 두 가지는 (1) db_like()인수를 올바르게 이스케이프하고 (2) 와일드 카드 문자를 명시 적으로 추가해야한다는 것입니다. 또한 데이터베이스에서 기본 데이터 정렬을 사용하므로 다른 것을 지정할 수있는 방법이 없다고 생각합니다.
mpdonadio

1
나는 이것을 좀 더 포괄적으로 만들기 위해 오늘 나중에 패스를 할 수 있습니다. 나는 DB API를 기억할 수 없으며 어제 말 그대로 동일한 것을 찾고있었습니다.
mpdonadio

1

"LIKE"쿼리를 작성할 때 Drupal \ Core \ Database \ Database를 사용할 수도 있습니다. db_select ()는 더 이상 사용되지 않으므로 Drupal 8 대체 구문입니다.

$database = Database::getConnection();
$query = $database->select('TABLE NAME', 'u')
    ->fields('u', array('column1','column2'));
$query->condition('column1', '%'.$database->escapeLike($search_phrase) . '%', 'LIKE');

또는 OR 쿼리로 배수를 추가하십시오.

$DB_OR = $query->orConditionGroup()
  // find match anywhere in field
  ->condition('column1', '%' . $database->escapeLike($search_phrase) . '%', 'LIKE')

  // find match starting at beginning
  ->condition('column2', $database->escapeLike($search_phrase) . '%', 'LIKE');

  // find match at end of field
  ->condition('column1', '%' . $database->escapeLike($search_phrase), 'LIKE')
$query->condition($DB_OR); // Add OR object as condition
$result = $query->execute();

글로벌 "db_like ()"대신 내장 데이터베이스 함수 (escapeLike)를 사용하기 때문에이 솔루션을 선호합니다. 또한 세 가지 가능성을 모두 언급합니다.
ssibal

1

"like"를 사용하는 db_select것은 다음과 같으며 나를 위해 일했습니다 ...

$search_value = "testvalue@xmail.com";
$query = db_select('TABLE NAME', 'u');
$query->fields('u', ['ROW1', 'ROW2']);
$query->condition('ROW1', '%' . db_like($search_value) . '%', 'LIKE');
$result = $query->execute();

ROW1의 정확한 값은 "testvalue@xmail.com"이며 LIKE조건 을 사용 db_select하여 출력을 "testvalue@xmail.com"으로 얻습니다.


0

그것은 Drupal8 버전 1에서 작동합니다

$exp = "1";
$connection = \Drupal::database();
$query = $connection ->select('node', 'n');
    $query->fields('n');
    $query->condition('nid', '%'.db_like($exp), 'LIKE');
    $records = $query->execute();
foreach ($records as $record) {
ksm($record);
}

버전 2

$connection = \Drupal::database();
$query = $connection->query("SELECT *FROM {node} WHERE nid like '%' :nid '%'", [
  ':nid' => "1",
]);
$records = $query->fetchAll();

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