如何使用Eloquent在表和联接表中同时进行过滤?

时间:2019-04-10 09:34:40

标签: php sql laravel eloquent lumen

我有两个表product_templateshorttitles

一个产品可以有多个标题,具体取决于语言 产品具有主要标题(称为mmac_ebay_titolo),而简称具有名称,即使用不同语言的标题。

我的目标 是根据发布的内容过滤带有已发布字符串的缩写标题和product_template标题。

如果未传递任何过滤器字符串,则一切正常。

shorttitles模型具有以下关系:

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

product_template模型具有以下关系:

public function shorttitle()
{
    return $this->hasMany('App\ShortTitle', '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();

如果子查询与where子句不匹配,则此查询返回所有带有“ prodotto” = null的短标题。为什么?

在此之后,我将使用以下过滤主短标题表:

$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 个答案:

答案 0 :(得分:0)

尝试此查询:

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