【问题标题】:How i can filter, with Eloquent, either in tables and join tables at the same time?我如何使用 Eloquent 过滤表和连接表?
【发布时间】:2019-08-31 17:17:23
【问题描述】:

我有两张桌子,product_templateshorttitles

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

我的目标是根据帖子输入过滤短标题标题和带有posted字符串的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%'
)

我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: php sql laravel eloquent lumen


    【解决方案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);
    

    【讨论】:

    • 谢谢,它有效,但它与原始查询相同......是否可以使用纯雄辩的方法?
    • daylerees.com/code-happy-eloquent-orm 检查此 URL,您可以找到“Eager Loading”,这将对您有所帮助
    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2022-08-24
    • 2018-11-06
    • 1970-01-01
    • 2013-09-03
    • 2015-09-06
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多