Мой код;

$posts=Term::where('user_id',$user_id)->where('status',1)->where('type','product')->with('preview','attributes','category','price','options','stock','affiliate')->withCount('reviews');

       if(!empty($request->term)){
            $data= $posts->where('title','LIKE','%'.$request->term.'%');
       }

Этот мой код ищет заголовок из таблицы терминов. Но я хочу искать из другой таблицы, не нарушая структуру. Итак, пример;

 if(!empty($request->term)){

    $data= $termTABLE->where('title','LIKE','%'.$request->term.'%');
    $data= $stockTABLE->where('code','LIKE','%'.$request->term.'%');
    
}

Поскольку я ничего не знаю о Laravel, я не мог объяснить его полностью. Я надеюсь, что получу помощь. Спасибо.

Удачи

0
frankosa 3 Фев 2022 в 16:56
Можете ли вы уточнить, что, по вашему мнению, представляют собой $termTABLE и $stockTABLE в этом псевдокоде?
 – 
miken32
3 Фев 2022 в 20:40

2 ответа

Приведенный ниже пример не похож на ваш, но вы можете отсортировать его в соответствии с вашими потребностями.

Например, если у пользователя есть компания, вы можете выполнить поиск в таблице компаний, например

          $user->where('name', 'LIKE', '%' . $searchPhrase . '%') //Searching in user table
                //Searching in user table
               ->orWhere('email', 'LIKE', '%' . $searchPhrase . '%')
                //Checking if company exist
               ->orWhereHas('company', function ($query) use ($searchPhrase) { 
                    //Searching in company table
                    $query->where('name', 'LIKE', '%' . $searchPhrase . '%'); 
               });
0
Faith Online 3 Фев 2022 в 17:42
Поиск по 2 разным таблицам из одного поискового запроса. Как я могу это сделать?
 – 
frankosa
3 Фев 2022 в 17:24
Если у вас есть настройка отношения, то приведенный выше код представляет собой один запрос.
 – 
MeGaZ
3 Фев 2022 в 17:44

Я думаю, ты пытаешься фильтровать свои отношения? Если это так, это делается путем передачи обратного вызова методу with():

$posts = Post::where('user_id', $user_id);
    ->where('status',1)
    ->where('type','product')
    ->where('title', 'like', '%' . $request->input('term') . '%')
    ->with('preview', 'attributes', 'category', 'price', 'options', 'affiliate')
    ->with([
        'stock' => fn ($q) => $q->where('code', 'like', '%' . $request->input('term') . '%')
    ])
    // optional, see note below
    ->whereHas('stock', fn ($q) => $q->where('code', 'like', '%' . $request->input('term') . '%'))
    ->withCount('reviews');

Итак, мы удалили отношение stock из списка и поместили его в собственный вызов with() с обратным вызовом, который будет фильтровать возвращаемое.

Обратите внимание, что нет необходимости проверять, имеет ли поле запроса значение, так как LIKE %% вернет все записи.

Если вы хотите, чтобы возвращались только сообщения с совпадающими отношениями, добавьте вызов whereHas(), который в первую очередь обеспечит наличие желаемых отношений. Чтобы уточнить:

  • Post::with('stock') возвращает все посты со всеми акциями
  • Post::with('stock', 'some condition') возвращает все посты с некоторыми акциями
  • Post::whereHas('stock', 'some condition') возвращает несколько постов со всеми акциями
  • Post::whereHas('stock', 'some condition')->with('stock', 'some condition') возвращает несколько постов с некоторыми акциями.
0
miken32 3 Фев 2022 в 21:08