drupal sql условные предложения для нескольких таблиц?

0

У меня есть приведенный ниже запрос для модифицированного поискового модуля FAQ, который работает в Drupal 7, который ищет в двух таблицах: 1) заголовок 2) тело, но не удается включить еще одну.

$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100));

$query = "SELECT DISTINCT fq.title, fq.nid
 FROM {node} AS fq, {field_data_body} AS f
 WHERE fq.title LIKE :term
 OR fq.type LIKE :term
 OR f.body_value LIKE :term
 AND f.entity_id = fq.nid";

$result = db_query($query, array(':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%'));

Я хотел бы добавить еще одно, чтобы включить в поиск поле подробных вопросов, но я думаю, что проблема связана с nid? Я попытался поместить оба в пункт, но, кажется, неправильно. Помогите, пожалуйста :)

AND (fd.entity_id = fq.nid ИЛИ fb.entity_id = fq.nid) ";

$term = strip_tags(drupal_substr($_POST['keyword'], 0, 100));
$query = "SELECT DISTINCT fq.title, fq.nid
    FROM {node} AS fq, {field_data_field_detailed_question} AS fd, {field_data_body} AS fb
    WHERE fq.title LIKE :term
    OR fd.field_detailed_question_value LIKE :term
    OR fb.body_value LIKE :term
    AND (fd.entity_id = fq.nid OR fb.entity_id = fq.nid)";
$result = db_query($query, array(':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%',':term' => '%%' . $term . '%%'));

$string = "";
while ($row = $result->fetchObject()) {
    $string .= "<a href='/" . drupal_get_path_alias('node/' . $row->nid) . "'>" . $row->title . "</a>"; 
}
echo $string;

ОБНОВЛЕНИЕ: Спасибо Syscall, который помог мне заставить его подход работать (см. Чат).

Мне также удалось удалить пустые пробелы (добавив новую переменную и используя array_filter> я думаю, что проблема заключалась в разделении пробелов и обрезки в то время, когда array_map все еще создавала пустые строки.) И добавлении условия для исключения узлов, не опубликованных через db_and ( ) ссылка на n.status = 1.

$terms = explode(' ', $term); // split using ' '
$terms = array_map('trim', $terms); // remove unwanted spaces
$termsfiltered = array_filter($terms);
$or = db_or();
foreach ($termsfiltered as $term) {
    $or->condition('fd.field_detailed_question_value', '%'.db_like($term).'%', 'LIKE');
    $or->condition('fb.body_value','%'.db_like($term).'%' , 'LIKE');
    $or->condition('n.title','%'.db_like($term).'%' , 'LIKE');
}
$and = db_and()->condition('n.status','1' , 'LIKE');

$query = db_select('node', 'n');
$query->fields('n');
$query->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid');
$query->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid');
$query->condition($or);
$query->condition($and);
$stmt = $query->execute(); // execute the query (returns the "statement" to fetch).

ps вставка var_dump ($ variabletodump); был действительно полезен при изменении кода и просмотре эффектов массивов для решения проблем.

Теги:
drupal
drupal-7

2 ответа

1
Лучший ответ

Вы не можете leftJoin (или любое join) в запросах Drupal, поскольку leftJoin() возвращает псевдоним, а не запрос. Затем вы должны использовать execute() для "запуска" запроса.

$or = db_or()
  ->condition('fd.field_detailed_question_value', '%'.db_like($term ).'%', 'LIKE')
  ->condition('fb.body_value','%'.db_like($term ).'%' , 'LIKE');

$query = db_select('node', 'n');
$query->fields('n');
$query->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid');
$query->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid');
$query->condition($or);
$stmt = $query->execute(); // execute the query (returns the "statement" to fetch).

while ($row = $stmt->fetchObject()) {
    //..
}

Вы должны добавить поля:

$query = db_select('node', 'n')->fields('n');

или же

$query = db_select('node', 'n')
         ->addField('n','title')
         ->addField('n','nid');
  • 0
    спасибо @Syscall! Я видел подобные примеры и уже задавался вопросом. Я пробовал вас, которые не давали мне ошибок, но пока не дали никаких результатов :( Я дважды проверил имена таблиц и столбцов, и они звучат хорошо. Должно ли это работать с $string = ""; while ($row = $result->fetchObject()) { $string .= "<a href='/" . drupal_get_path_alias('node/' . $row->nid) . "'>" . $row->title . "</a>"; } echo $string; ;?
  • 0
    не уверен, цикл while должен печатать результаты, но ничего не отображается. (не уверен, как еще я могу проверить массив при выполнении поиска)
Показать ещё 6 комментариев
1
$or = db_or()
  ->condition('fd.field_detailed_question_value', '%'.db_like($term ).'%', 'LIKE')
  ->condition('fb.body_value','%'.db_like($term ).'%' , 'LIKE');

$results = db_select('node', 'n')
  ->fields('n', array('nid', 'title'))
  ->leftJoin('field_data_body' , 'fb', 'fb.entity_id=n.nid')
  ->leftJoin('field_data_field_detailed_question' ,'fd', 'fd.entity_id=n.nid')
  ->condition($or)
  ->execute()
  ->fetchAll();

var_dump($results);

Документация db_select

Документация db_or

  • 0
    вау спасибо @Fky! Я хотел бы узнать больше о Drupal-запросе, это очень помогает. Я попробовал это, но получил "FATAL ERROR: CALL TO A MEMBER FUNCTION LEFTJOIN() " для второго leftJoin. (Я понимаю, что это EFQ, а не SQL-запрос, поэтому он заменяет весь мой $ запрос).
  • 1
    Я скучаю по полям инструкции, поэтому я отредактировал свой пост, вы можете попробовать еще раз @Markus
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню