Laravel Как найти результат поиска, найденный из или где-либо - PullRequest
0 голосов
/ 30 октября 2018

Поскольку этот вопрос может показаться слишком простым, но я застрял в нем. Так что я имею в виду, предположим, что у меня есть таблица, которая содержит title и description для поиска по обоим, я буду использовать

return Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();

Теперь я хочу узнать, как найти результат Eloquent для поиска из description вместо title

Мне нравится, если я ищу термин mydescription , который существует в описании, а не в заголовке, и красноречиво возвращает мою модель.

Но как я могу узнать, что результат, полученный из Eloquent, является частью описания вместо заголовка?

Примечание: Я знаю, что могу выполнить поиск строки в возвращаемом описании по eloquent через регулярное выражение, но в моем случае это неэффективно. потому что (а) мое описание довольно большое. Это длинное текстовое поле. (B) После того, как я выполнил поиск по моей модели, я обнаружил, что это немного против СУХОГО, чтобы повторить себя снова при поиске по строке.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Может быть, вам нужно сравнить переменную $ search с атрибутами заголовка и описания, полученными из Eloquent?

    $collection = Model::where('title','LIKE','%'.$search.'%')
            ->OrWhere('description','LIKE','%'.$search.'%')->get();
$isDescription = $collection->description === $search;

Я не уверен, что это лучшее решение.

0 голосов
/ 30 октября 2018

Чтобы сделать это в одном запросе, вам нужно добавить в результат запроса новый столбец, который указывает, где находится результат поиска.

Это можно сделать с помощью SQL CASE. Вот общий пример:

$select  = "*, CASE";
$select .= " WHEN (title LIKE '%".$search."%' and description LIKE '%".$search."%') THEN 'title-description'";
$select .= " WHEN (title LIKE '%".$search."%') THEN 'title'";
$select .= " WHEN (description LIKE '%".$search."%') THEN 'description'";
$select .= " END as FoundIn";

Model::selectRaw($select)->where('title','LIKE','%'.$search.'%')->orWhere('description','LIKE','%'.$search.'%')->get();

Это добавит к результату новый столбец с именем «FoundIn», который указывает, где находится результат поиска.

Реальный пример:

$search = "Dummy";
$select  = "*, CASE";
$select .= " WHEN (topic LIKE '%".$search."%' and subject LIKE '%".$search."%') THEN 'topic-subject'";
$select .= " WHEN (topic LIKE '%".$search."%') THEN 'topic'";
$select .= " WHEN (subject LIKE '%".$search."%') THEN 'subject'";
$select .= " END as FoundIn";

Message::selectRaw($select)->where('topic','LIKE','%'.$search.'%')->orWhere('subject','LIKE','%'.$search.'%')->get();

Результат:

Illuminate\Database\Eloquent\Collection {#2929
    all: [
    App\Message {#2947
        id: 3,
        topic: "Dummy Title",
        subject: "Dummy Description",
        created_at: null,
        updated_at: null,
        FoundIn: "topic-subject",
    },
    App\Message {#2940
        id: 4,
        topic: "Dummy Title",
        subject: "Smart Description",
        created_at: null,
        updated_at: null,
        FoundIn: "topic",
    },
    App\Message {#2941
        id: 5,
        topic: "Smart Title",
        subject: "Dummy Description",
        created_at: null,
        updated_at: null,
        FoundIn: "subject",
    },
    ],
}
0 голосов
/ 30 октября 2018

Вы можете сделать два запроса вместо одного:

$fromTitle = Model::where('title','LIKE','%'.$search.'%')->get();
$fromDesc = Model::where('description','LIKE','%'.$search.'%')->get();

return ['title'=>$fromTitle, 'description'=>$fromDesc];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...