在Laravel中使用查询合并雄辩的集合?

时间:2017-02-11 20:22:45

标签: php mysql laravel laravel-5.1

是否可以将有说服力的集合与查询构建器合并?

在这个例子中,我有3张桌子。图像表,标签表和images_tag表。我在图像和标签模型中也有雄辩的关系。

Tag.php:

class Tag extends Model {

 protected $table = 'tags';

 public $timestamps = false;

 protected $fillable = [
    'tagname',
 ];

 public function Images() {
    return $this->belongsToMany('CommendMe\Models\Images');
 }  

}

Images.php:

public function tags() {
    return $this->belongsToMany('CommendMe\Models\Tag');
}   

我想做的是这样的事情:

$tag = Tag::where('tagname', $query)->first();

$imagesWithTag = $tag->images;

$imagesWithoutTag = Images::where('title', 'LIKE', "%{$query}%");

$images = $imagesWithTag + $imagesWithoutTag
   ->whereIn('mature', [0, $mature])
   ->where('created_at', '>=', Carbon::now()->subHours($withinHours))
   ->orderBy($orderByString, 'desc')
   ->Paginate(50);     

基本上只是获取查询(从images表返回一个数组)和集合(也从images表中返回一个数组),对结果进行组合和排序。

这可能吗?

编辑2:

尝试Paras的新答案时,会出现以下错误:

  SearchController.php第98行中的

FatalThrowableError:呼叫成员   函数toArray()在整数

1 个答案:

答案 0 :(得分:2)

试试这个:

$tag = Tag::where('tagname', $query)->first();
$imageIds = $tag->images()->select('images.id')->get()->pluck('id')->toArray(); // assuming your images table name is "images" and primary key name is "id"
$images = Images::where(function($q) use($imageIds, $query) {
        $q->whereIn('id', $imageIds)
          ->orWhere('title', 'LIKE', "%{$query}%");
    })->whereIn('mature', [0, $mature])
      ->where('created_at', '>=', Carbon::now()->subHours($withinHours))
      ->orderBy($orderByString, 'desc')->paginate(50);