Подтвердить что ты не робот

Laravel принадлежит Не работает

У меня есть 2 модели в моем приложении, "Пользователь" и "Медицина" (каждый пользователь принадлежит к одному типу MedicineType).

Я установил отношение "один ко многим" между двумя моделями, используя attributesTo() и hasMany(). Отношение hasMany() работает отлично, но propertyTo() не работает. Кто-нибудь знает, где я совершил ошибку?

Пользователь:: find (1) → medicine_type [ничего не возвращает]

MedicineType:: find (1) → Пользователи [это возвращает пользователей]

Вот код для моделей:

class MedicineType extends Eloquent {

    public function users()
    {
        return $this->hasMany('User');
    }
}


class User extends Eloquent {

    public function medicine_type()
    {
        return $this->belongsTo('MedicineType');
    }
}

И вот моя структура базы данных:

users:
    id
    name
    medicine_type_id 

medicine_types:
    id
    name
4b9b3361

Ответ 1

Причина, по которой ваше отношение не работает, происходит не из-за отношений, указанных в модели, а из-за имени метода в модели User и не указав внешний ключ.

Вместо:

public function medicine_type()
{
    return $this->belongsTo('MedicineType');
}

Использование:

public function medicineType()
{
    return $this->belongsTo('MedicineType', 'id');
}

Я надеюсь, что это сработает для вас;)

Все вместе:

<?php // app/models/MedicineType.php

class MedicineType extends Eloquent {

   // Determines which database table to use
   protected $table = 'medicine_types';

   public function users() 
   {
      return $this->hasMany('User');
   }

}

и:

<?php // app/models/User.php

class User extends Eloquent {

   // Determines which database table to use
   protected $table = 'users';

   public function medicineType() 
   {
      return $this->belongsTo('MedicineType', 'id');
   }

}

Тестирование, если оно работает:

$user = User::find(1);
return $user->medicineType->name;

Это успешно возвращает соответствующее имя medical_type.

Надеюсь, это поможет вам и дальше;)

Ответ 2

Может быть, проблема с Eloquent заключается в поиске внешнего ключа. Попробуйте следующее:

class User extends Eloquent {

    public function medicine_type()
    {
        return $this->belongsTo('MedicineType', 'medicine_type_id');
    }
}

EDIT:

Кроме того, Eloquent пытается найти таблицу "medicinetypes", а не "medecine_types", поэтому вам нужно указать это также с помощью переменной $table.

class MedicineType extends Eloquent {
    protected $table = 'medicine_types';

    public function users()
    {
        return $this->hasMany('User');
    }
}

Ответ 3

Я сделал глупую ошибку, не добавляя "возврат" в методе отношений!

Убедитесь, что вы возвращаете отношения... Очевидно, что это будет не:

public function medicineType() 
   {
      $this->belongsTo('MedicineType', 'id');
   }

Ответ 4

Я меняю "medicine_type" на "medicineType", и все стало нормально...

Ответ 5

В моем случае данные связанных моделей были удалены, и laravel не получает мягко удаленные данные в общем запросе. Чтобы получить мягко удаленные данные, вы должны использовать "withTrashed() или onlyTrashed()".

Вы можете проверить документацию здесь.

https://laravel.com/docs/5.6/scout#soft-deleting

Ответ 6

Ответ номер один может быть лучшим ответом в большинстве случаев. Тем не менее, если у вас все еще возникают проблемы с загрузкой соответствующих отношений и не повезло..

Есть еще одна вещь, которая может работать. Посмотрите на каждую из таблиц моделей и их индексы или внешние ключи. В моем случае я изменил имя таблицы, но никогда не обновлял индекс и внешние ключи.

Решение.

A: (чувствуя себя ленивым) Просто удалите связанный индекс или внешний ключ.

Б: (Я не ленивый). Удалите таблицу с помощью миграции с помощью Laravel и повторно запустите миграцию с помощью соответствующих внешних ключей.