#php #laravel #laravel-5.8
#php #laravel #laravel-5.8
Вопрос:
я знаю, что об этом много спрашивали, но ни одно из решений не работает для меня, поскольку я хочу использовать это в представлении
у меня есть 3 таблицы
Languages : id , title
Blog : id
BlogLanguage : blog_id , language_id , title , text
поэтому, когда я перечисляю блоги в представлении, для каждого блога я хочу показать, какие языки были сохранены для этого блога
в принципе, я хочу сделать что-то вроде этого
$blogs = Blog::all();
$languages = Language::all();
return view('blog-index' , compact('blogs' ,'languages));
в представлении
@foreach($blogs as $blog )
id : {{$blog->id}}
@foreach($languages as $lang )
{{$lang->title}} : {{ $lang->HasThisBlog($blog->id) ? 'yes' : 'no' }}
@endforeach
@endforeach
вот что я застрял
{{ $lang->HasThisBlog($blog->id) ? 'yes' : 'no' }}
если я могу иметь это отношение в языковой модели
function HasThisBlog($id){
return $this->hasOne(BlogLanguage::class )->where('blog_id' , $id ) ;
}
конечно, это не работает и дает мне какой-то странный объект, например
HasOne {#706 ▼
#foreignKey: "blog_languages.language_id"
#localKey: "id"
#query: Builder {#705 ▶}
#parent: Language {#560 ▶}
#related: BlogLanguage {#667 ▶}
#withDefault: null
}
Комментарии:
1. Вы определяете
hasOne
связь в модели, но используете сводную таблицу в своих миграциях. Может ли у васBlog
быть несколькоLanguages
или только один?2. @Unflux blog имеет несколько языков, в основном на веб-сайте есть около 10 языков, но оператор может ввести 2 или 3 и оставить остальные… я определил hasOne, потому что я проверяю для одного блога, есть ли у него язык или нет, поэтому он имеет отношение 1 к 1
Ответ №1:
Вам просто нужно определить отношение в вашей модели блога. Поскольку у вас уже есть сводная таблица для следующих отношений
Блог принадлежит ко многим языкам
Язык принадлежит многим блогам
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
}
Затем в виде блейда
@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