Как я могу фильтровать с помощью Eloquent либо в таблицах, либо в таблицах объединения одновременно?

#php #sql #laravel #eloquent #lumen

#php #sql #laravel #eloquent #lumen

Вопрос:

У меня есть две таблицы, product_template и shorttitles .

Продукт может иметь несколько кратких названий, в зависимости от языка, у продукта есть основное название (called mmac_ebay_titolo ), а у краткого заголовка есть имя, то есть название на другом языке.

Моя цель — фильтровать, в зависимости от ввода post, заголовок shorttitles и заголовок product_template с размещенной строкой.

если строка фильтра не передается, все работает нормально.

shorttitles Модель имеет такое отношение:

 public function prodotto()
{
    return $this->belongsTo('AppProduct', 'product_id', 'id');
}
  

product_template Модель имеет такое отношение:

 public function shorttitle()
{
    return $this->hasMany('AppShortTitle', 'product_id', 'id');
}
  

Но я застрял в приведенном ниже коде:

 $m = self::MODEL;
$query = $m::select("*");

$data["data"] = $query
 ->with(["prodotto" => function ($q) use ($params) {
            $q->select("id", "name", "mmac_ebay_titolo")
              ->where("name", "like", "%" . $params["search"] . "%");
       }]
)->where("lang_id", "=", 1)
 ->offset($start)
 ->limit($limit)
 ->orderBy("id", "asc")
 ->get();
  

Этот запрос возвращает все краткие названия… с помощью «prodotto» = null, если подзапрос не соответствует предложению where . Почему?

После этого я бы отфильтровал основную таблицу shorttitles следующим образом:

 $m = self::MODEL;
$query = $m::select("*");

$data["data"] = $query
 ->with(["prodotto" => function ($q) use ($params) {
            $q->select("id", "name", "mmac_ebay_titolo")
              ->where("mmac_ebay_titolo", "like", "%" . $params["search"] . "%");
       }]
)->where("lang_id", "=", 1)
 ->where("name", "like", "%" . $params["search"] . "%")
 ->offset($start)
 ->limit($limit)
 ->orderBy("id", "asc")
 ->get();
  

Я хочу воспроизвести этот запрос:

 Select
    s.name,
    p.name,
    p.mmac_ebay_titolo
From
    mmac_brx_ebay_shorttitles s Inner Join
    product_template p On s.product_id = p.id
where lang_id = 1
and
(
  s.name like '%PIGNONE%'
  or
  p.name  like '%PIGNONE%'
  or
  p.mmac_ebay_titolo like '%PIGNONE%'
)
  

Как я могу этого добиться?

Спасибо!

Ответ №1:

попробуйте этот запрос:

 $products = $query->join('product_template','mmac_brx_ebay_shorttitles.product_id','=','product_template.id')
    ->where(function ($query) {
       $query->Where('mmac_brx_ebay_shorttitles.name','like','%PIGNONE%')
             ->orWhere('product_template.name','like','%PIGNONE%')
             ->orWhere('product_template.mmac_ebay_titolo','like','%PIGNONE%');
    })->where('your_table_name.lang_id',1)
    ->select('mmac_brx_ebay_shortitles.name','product_template.name','product_template.mmac_ebay_titolo')
    ->paginate(10);
  

Комментарии:

1. Спасибо, это работает, но это то же самое, что и в необработанном запросе… можно ли использовать чистый подход eloquent?

2. daylerees.com/code-happy-eloquent-orm Проверьте этот URL-адрес, по которому вы можете найти «Нетерпеливая загрузка», которая поможет вам в этом