2017-02-11 19 views
0

雄弁なコレクションをクエリビルダーとマージできますか?Laravelのクエリで雄弁なコレクションをマージしますか?

この例では、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:基本的に

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

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

私が何をしたいのですが何がこのようなものですちょうどクエリを取る(これはイメージテーブルからn個の配列)、コレクション(イメージテーブルから配列を返す)、結果を結合して並べ替えます。

これは可能ですか?

EDIT 2:

パラスの新しい答えをしようと、次のエラーが発生します。

FatalThrowableErrorにSearchController.php行98:メンバーにコール 機能

整数上のtoArray()

答えて

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); 
+0

マイ・ポストを更新しました。私は、イメージテーブルとタグテーブルがお互いを直接参照していないことを指摘したいと思います。ただし、images_tagテーブルは機能します。列はtag_idとimage_idと呼ばれます。あなたの投稿は、ピボットテーブルではなく、イメージテーブルからtag_idを取得しようとしています。 –

+0

私のイメージテーブルは実際に "images"という名前で、その主キーは "id"です。しかし、私はまだエラーが発生します。私は自分の投稿を更新しました。 –

+0

それは動作します!ありがとうございました。 –