Làm thế nào để bạn xây dựng một điều kiện THÍCH trong truy vấn db_select ()?


14

Làm thế nào để bạn xây dựng một LIKEđiều kiện trong một db_select()truy vấn?

Tôi biết cách thực hiện việc này với db_query()lệnh gọi API, nhưng có một cú pháp / phương thức đặc biệt để thực hiện việc này với db_select()không?


2
Chỉ để tham khảo trong tương lai, bất cứ điều gì bạn có thể chuyển đến với db_querytư cách là người giữ chỗ đối số, bạn cũng có thể chuyển qua làm đối số ...Query::condition. Bạn sẽ không tìm thấy tài liệu cho từng toán tử riêng lẻ cho từng loại truy vấn khác nhau, vì sẽ không có ý nghĩa gì khi làm điều đó. Tất cả đều đi qua PDO vào cuối ngày, nếu db_likechuẩn bị một biến chính xác cho db_query, thì theo định nghĩa, nó sẽ chuẩn bị cùng một biến chính xác chodb_select
Clive

2
Trước khi bất cứ ai đề xuất nó, trừ khi bạn có thể tìm thấy câu hỏi về db_select + THÍCH, tôi không nghĩ chúng ta có một bản sao này. Chúng tôi có, db_query + THÍCH, nhưng mặc dù câu trả lời là như nhau, câu hỏi vẫn khác nhau.
mpdon Arena

Câu trả lời:


21

Sau khi đào bới Drupal Tài liệu tìm thấy một giải pháp trong db_like trang tài liệu API và SelectQuery: điều kiện trang doc xử lý ..

Ví dụ

$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();

Điều kiện để sử dụng cho truy vấn thích là

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

2
Hai điều cần chú ý ở đây là (1) db_like()là cần thiết để thoát đúng đối số và (2) bạn cần thêm rõ ràng các ký tự đại diện. Nó cũng sẽ sử dụng đối chiếu mặc định trên cơ sở dữ liệu và tôi không nghĩ có bất kỳ cách nào để chỉ định một cách khác.
mpdon Arena

1
Tôi có thể vượt qua sau ngày hôm nay để làm cho điều này toàn diện hơn một chút. Tôi không bao giờ có thể nhớ API DB và thực sự đang tìm kiếm điều tương tự ngày hôm qua.
mpdon Arena

1

Bạn cũng có thể sử dụng Drupal \ Core \ Database \ Database khi tạo truy vấn "THÍCH". Đây là cú pháp thay thế Drupal 8 vì db_select () không được dùng nữa.

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

Hoặc thêm bội số với truy vấn 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();

Tôi thích giải pháp này, vì nó sử dụng hàm cơ sở dữ liệu tích hợp (escLike) thay vì "db_like ()" toàn cầu. Cũng đề cập đến tất cả ba khả năng.
ssibal

1

Để sử dụng "like" trong db_selectnhư dưới đây và làm việc cho tôi ...

$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();

Ở đây giá trị chính xác trong ROW1 là "testvalue@xmail.com" và bằng cách sử dụng LIKEđiều kiện trong db_selecttôi đã nhận được đầu ra là "testvalue@xmail.com".


0

nó hoạt động trong Drupal8 Phiên bản 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);
}

Phiên bản 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.