Laravel Eloquent有很多人质疑

时间:2014-05-01 18:07:39

标签: laravel eloquent

请帮我在雄辩中提出这个问题。企业可以有很多类别。

SELECT b.* 
FROM   businesses b 
       INNER JOIN categorybusiness cb 
               ON b.id = cb.business_id 
       INNER JOIN category c 
               ON cb.category_id = c.id 
WHERE  b.location LIKE '%query1%' 
       AND b.location LIKE '%query2%' 
       AND c.name LIKE '%query3%' 
       AND c.name LIKE '%query4%' 

我的表格是......商家 - 包含位置列和类别及业务的数据透视表。

更新: 所以我使用了这个查询...

$business5 = Business::WhereHas('categories', function($q) use($category,$query1)
    {
          $q->whereRaw("name like '%$category%' or businesses.name like '%$category%' $query1");         
    })->get();

$ query1看起来像这样但是在一个循环中。

     $query1 .= " and businesses.address1 like '%$string%'"; 

它工作正常,但有人可以帮助我做一个"对抗"这句话很有说服力。

2 个答案:

答案 0 :(得分:3)

要进行Eloquent查询,您需要设置关系并创建一个many-to-many关系,您需要在两个模型中建立这样的关系:

Business型号:

class Business extends Eloquent {
    //...
    public function categories()
    {
        return $this->belongsToMany('Caregory');
    }
}

Category型号:

class Category extends Eloquent {
    //...
    public function businesses()
    {
        return $this->belongsToMany('Business');
    }
}

Eloquent查询(您已有pivot表):

$businesses = Business::with(array('categories' => function($q) use ($query3, $query4) {
    $q->where('categories.name', 'LIKE', '%'. $query3 .'%')
      ->where('categories.name', 'LIKE', '%'. $query4 .'%');
}))->where('businesses.location', 'like', '%'. $query1 .'%')
   ->where('businesses.location', 'like', '%'. $query2 .'%')
   ->get();

要检查结果,只需使用dd($businesses);并检查收藏集,这样您就可以了解如何在view中循环播放这些内容。基本上,$businesses将包含一个集合,集合中的每个$business模型将包含另一个$categories集合,因此循环可能是这样的:

@foreach($businesses as $business)
    {{ $business->propertyname }}
    @foreach($business->categories as $category)
        {{ $category->propertyname }}
    @endforeach
@endforeach

答案 1 :(得分:1)

假设您有Business moel设置,这正是您想要的查询,因为@WereWolf建议的急切加载不会在这里完成工作(连接表上的子句与2个单独的查询) :

Business::from('businesses as b')
  ->join('categorybusiness as cb', 'b.id', '=', 'cb.business_id')
  ->join('category as c', 'c.id', '=', 'cb.category_id')
  ->where('b.location', 'like', "%$query1%")
  ->where('b.location', 'like', "%$query2%")
  ->where('c.name', 'like', "%$query3%")
  ->where('c.name', 'like', "%$query4%")
  ->get(['b.*']);

只要您正确设置whereHas关系,还有另一种使用belongsToMany方法的方法

Business::whereHas('categories', function ($q) use ($query3, $query4) {
    $q->where('categories.name', 'like', "%$query3%")
      ->where('categories.name', 'like', "%$query4%");
})->where('businesses.location', 'like', "%$query1%")
    ->where('businesses.location', 'like', "%$query2%")
    ->get();