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
Ответы
Ответ 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 и повторно запустите миграцию с помощью соответствующих внешних ключей.