2017-01-15 4 views
1

На моем сайте пользователи могут загружать изображения и прикреплять теги к этим изображениям.Объединение результатов запроса в laravel

У меня есть таблица изображений, таблица тегов и сводная таблица images_tag.

Изображения могут иметь много тегов, а теги могут принадлежать многим изображениям.

Я хочу, чтобы иметь возможность генерировать список всех тегов, которые пользователь использовал в своих изображениях.

$imageIDs = Images::where('created_by', Auth::user()->id)->lists('id'); 

Таким образом, это создаст список всех идентификаторов изображений, которые пользователь загрузит.

Что я хочу по существу «foreach $ imageIDs, проверьте таблицу images_tag и для каждого матча перейдите в таблицу тегов и верните мне значение тэга».

Но я понятия не имею, как я это сделаю.

Возможно, foreach затем использует метод слияния по всем результатам? Любая помощь будет оценена!

ответ

1

Вы должны использовать whereHas() проверить отношения:

$userTags = Tags::whereHas('images', function($q) { 
    $q->where('created_by', auth()->user()->id); 
})->get(); 

Тогда просто передать эти данные в целях:

return view('some.view', compact('userTags')); 

И перебирать теги в целях:

@foreach ($userTags as $tag) 
    {{ $tag->name }} 
@endforeach 
+1

Это прекрасно работает! Благодаря! –

1

Что вы можете сделать это.

class Tag extends Model 
{ 
    public function images() 
    { 
     return $this->belongsToMany(Image::class); 
    } 
} 

class SomeController 
{ 
    public function someMethod() 
    { 
     $tags = Tag::with(['images' => function ($image) { 
      return $image->where('created_by', Auth::user()->id); 
     }])->select('id', 'tagname')->get(); 
     // these are your $tags 
    } 
} 

Вы не должны использовать запрос внутри foreach(). Тогда это приведет к N+1 problem. То, что вы делаете, - это нетерпеливая загрузка с помощью инструкции with().

+0

Не будет ли это возвращать только один результат, а не многие? –

+1

Вы получаете «коллекцию». '$ tag collection' содержит все теги, соответствующие вашему запросу. https://laravel.com/docs/5.3/collections – Gayan

+0

Достаточно честный. Итак, у меня уже были первые функции, images(), в моей модели Tag, делающей все, что принадлежит многим. Однако я не уверен, как работает какой-то метод. Я все еще довольно новичок в Laravel. Как я могу вызвать эту функцию в моем контроллере, чтобы я мог вернуть представление с помощью тегов $? –

Смежные вопросы