如何在Laravel Eloquent中使用内部联接和子查询

时间:2018-02-12 12:54:09

标签: php laravel postgresql orm laravel-query-builder

注意:这是laravel 5.3

基本上当用户选择阿拉伯语翻译时我正在运行查询..完整的sql看起来像这样

select s.ref, t.text as ref_ar 
  FROM stores AS s 
  INNER JOIN 
     (SELECT item, text 
      FROM translator_translations 
      WHERE locale ='ar' 
        AND namespace ='*' 
        AND item like 'store.ref%'
      ) AS t 
   ON substring(s.ref_translation from 14 for 26) = t.item;

在官方的Laravel文档中没有看到关于子查询的文档(有内部联接但不够好),SO建议似乎超出了hacky ..建议?

上下文

这将用作模型中的范围,因此这适用于:

public function scopeFilterLanguage($query, $language_id)
{
    if (!$language_id || intval($language_id) != LanguageConstants::ARABIC_LANGUAGE_ID) {
        return $query;
    }
    return $query->whereRaw("
    substring(ref_translation from 14 for 26) in 
                                    (select item 
                                     from 
                                     translator_translations 
                                     where 
                                     locale ='ar' and namespace ='*' 
                                     and 
                                     item like 'store.ref%')");

}

但它并没有给我我想要的东西。 (即我必须在本文开头使用更大的版本)

2 个答案:

答案 0 :(得分:3)

这工作(忽略像这样的动态东西 - > getClassName等)..基本逻辑工作得很好

public function scopeAddTranslations($query)
{
    $t = new Translation();

    $subq = $t->select('item','text as ref_ar')
              ->where('locale','=','ar')
              ->where('item','like',$this->getClassName().'.ref%');

    $query->leftjoin(\DB::raw('('.$subq->toSql().') as t'), 
      function ($join) use ($subq) { 
          $join->on(\DB::raw('SUBSTRING('.$this->getTable().'.ref_translation 
                              FROM 14 FOR 26)'),
                                 '=',
                                 \DB::raw('t.item'))
                   ->addBinding($subq->getBindings());
            });
    return $query;
}

答案 1 :(得分:2)

这是我完全未经测试和最佳猜测的努力。

gvGrid_RowDataBound