Laravel Недопустимый аргумент для foreach

Модель Доктор

class Doctor extends Model
{
    public function addresses() {
        return $this->belongsTo(Doctor::class);
    }
}

Адрес модели

 class Address extends Model
    {
      public function doctors() {
          return $this->hasMany(Address::class);
      }
    }

ВрачиКонтроллер

class DoctorsController extends Controller
{
    public function index()
    {
        $doctors = Doctor::with('addresses')->get();

        return view('doctors.index',compact('doctors'));
    }
}

Лезвие

@foreach($doctors as $doctor)
    {{ $doctor->name }}
    @foreach($doctor->addresses as $address)
        {{ $address->city }}
    @endforeach

@endforeach

у меня ошибка

Недопустимый аргумент для foreach()

Я пытался установить связь между Доктором и Адресом, но это не сработало. Если я попробую dd($doctor->addresses), у меня будет null.


person Olek Szewczak    schedule 01.07.2018    source источник


Ответы (2)


имеет ли смысл, что у врача много адресов, а у адреса много врачей? Основываясь на ваших моделях, у вас действительно есть отношения «многие ко многим» между врачами и адресами?

Почему бы вам не сделать это таким образом. у врача много адресов? так что отношения один ко многим

тогда ваши модели будут такими.

Модель доктора

class Doctor extends Model
{
    public function addresses() {
        return $this->hasMany('App\Address','DoctorId');// you need to indicate the foreign key if you didn't follow the laravel naming convention
    }
}

модель адреса

class Address extends Model
{
    public function doctor() {
        return $this->hasOne('App\Doctor','DoctorId');// you need to indicate the foriegn key if you didn't follow the Laravel naming convention
      }
}

ты контроллер

class DoctorsController extends Controller
{
    public function index()
    {
        $doctors = Doctor::all();//or Doctor::where('something','=','value')->get();

        return view('doctors.index',compact('doctors'));
    }
}

Ваше мнение

@foreach($doctors as $doctor)
    {{ $doctor->name }}
    @foreach($doctor->addresses as $address)
        {{ $address->city }}
    @endforeach

@endforeach
person Kevin Loquencio    schedule 01.07.2018

Вы ссылаетесь на один и тот же класс в своих отношениях («Доктор принадлежит Доктору»), что, вероятно, не сработает.

Пытаться:

class Doctor extends Model
{
    public function addresses() {
        return $this->hasMany(Address::class);
    }
}
 class Address extends Model
    {
      public function doctors() {
          return $this->belongsTo(Doctor::class);
      }
    }
person Tobias K.    schedule 01.07.2018
comment
теперь у меня есть SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «addresses.doctor_id» в «предложении where» (SQL: выберите * из адресов, где address.doctor_id в - person Olek Szewczak; 01.07.2018
comment
Итак, какова структура таблицы addresses? Laravel просто предполагает, что FK называется CLASS_id, поэтому он угадывает doctor_id. Если это что-то другое, вам нужно указать это, используя второй аргумент для hasMany, например: $this->hasMany(Address::class, 'id_of_doctor') — см. также раздел «Один ко многим» в laravel.com/docs/5.6/eloquent-relationships - person Tobias K.; 01.07.2018