i know this has been asked alot , but none of the solution works for me as i want to use this in the view
i have 3 tables
JavaScript
x
Languages : id , title
Blog : id
BlogLanguage : blog_id , language_id , title , text
so when i list the blogs in the view , for each blog i want to show what languages has been stores for this Blog
basically i want to do something like this
JavaScript
$blogs = Blog::all();
$languages = Language::all();
return view('blog-index' , compact('blogs' ,'languages));
in the view
JavaScript
@foreach($blogs as $blog )
id : {{$blog->id}}
@foreach($languages as $lang )
{{$lang->title}} : {{ $lang->HasThisBlog($blog->id) ? 'yes' : 'no' }}
@endforeach
@endforeach
here is what im stuck
JavaScript
{{ $lang->HasThisBlog($blog->id) ? 'yes' : 'no' }}
if i can have this relation in the Language model
JavaScript
function HasThisBlog($id){
return $this->hasOne(BlogLanguage::class )->where('blog_id' , $id ) ;
}
of course this doesn’t work and gives me some weird object like
JavaScript
HasOne {#706 ▼
#foreignKey: "blog_languages.language_id"
#localKey: "id"
#query: Builder {#705 ▶}
#parent: Language {#560 ▶}
#related: BlogLanguage {#667 ▶}
#withDefault: null
}
Advertisement
Answer
You just need to define a relation on you Blog model. As you already have pivot table for the following relationships
Blog belongsToMany Language(s)
Language belongsToMany Blog(s)
JavaScript
class Blog extends Model
{
public function languages()
{
return $this->belongsToMany(Language::class);
}
//....other code of the class
}
class Language extends Model
{
public function blogs()
{
return $this->belongsToMany(Blog::class);
}
//... other code of the class
}
Then in blade view
JavaScript
@foreach($blogs as $blog)
<p>{{ $blog->id }}</p>
@foreach($languages as $language)
<p>{{ $language->title }}: {{ $blog->languages->contains('id', $language->id) ? 'Yes' : 'No' }}</p>
@endforeach
@endforeach