вызывающая связь с параметром в представлении

#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