Я использую laravel 5.1. Сценарий выглядит следующим образом (это пример. Реальный сценарий похож на данном примере)Laravel-Many-to-one Полиморфное отношение
У меня есть 3 модели
- колледжа
- Студент
- Учитель
колледж может иметь много учеников, но студент может принадлежать только одному колледжу.
В колледже может быть много учителей, но учитель может принадлежать только одному колледжу.
Я хочу установить отношения между этими таблицами в laravel. Одним из методов для этого является размещение внешнего ключа на уровне учащихся и учителей college_id. Но в моем случае этот внешний ключ будет недействительным много раз. Поэтому вместо того, чтобы иметь отдельные столбцы в 3-4 таблицах с почти нулевыми значениями, я хотел бы изучить возможность наличия полиморфных отношений для таблицы College.
Это то, что я пробовал: Пример, приведенный в Laravel документации (ссылка ниже) показывают отношение один-ко-многим в то время как мой сценарий больше из многих одного отношения.
http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations
Как показано в примере, имея collegeable_id и collegeable_type столбцы таблицы колледжа не выполнил бы мое требование, как колледж может содержать много студентов/преподавателей, поэтому я создал сводную таблицу:
Schema::create('collegeables', function (Blueprint $table) {
$table->integer('college_id')->unsigned();
$table->integer('collegeable_id')->unsigned();
$table->string('collegeable_type');
});
И у меня есть следующие модели
колледж Модель:
namespace App;
use Illuminate\Database\Eloquent\Model;
class College extends Model
{
public function students()
{
return $this->morphedByMany('App\Student', 'collegeable');
}
}
Студент Модель:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
public function college()
{
return $this->morphOne('App\Colleges', 'collegeable');
}
}
При такой компоновке, я могу хранить студент, используя экземпляр модели колледжа как этого
$college = \App\College::find(1);
$student = new \App\Student;
$student->name = 'John Doe';
$college->students()->save($student);
Но когда я пытаюсь получить экземпляр модели колледжа с использованием модели студента например, как указано ниже, он дает мне ошибку: -
public function index()
{
return \App\Student::find(1)->college;
}
SQLSTATE [42S22]: Column не найдено: 1054 Неизв собственный столбец «colleges.collegeable_id»
Это вроде ожидается, поскольку morphOne работает со столбцами в таблице, я полагаю. Если я изменяю функцию morphOne в модели Student для morphToMany, код начинает работать, и я также могу получить значения. Но это делает эти отношения многими, многие из которых снова не то, что я хочу.
Так что мой вопрос заключается в следующем: - Является ли их функция morphSomething я могу использовать в модели студента, чтобы иметь возможность получить значение колледжа студента, поддерживая отношения как один-ко-многим?
Любая помощь была бы действительно оценена. Благодарю.
Я думаю, что вы все испортили, и вам не нужны Полиморфные отношения в вашем случае. – fico7489
@MikelBitson, спасибо. Я использовал функции morphOne-morphTo и morphMany-morphTo для отношений «один к одному» и «один ко многим». Функция в колледже используется в этих сценариях, но она не работает для моего сценария. –
@ fico7489, да, я действительно на этапе планирования, и мне просто интересно, возможно ли это. Я понимаю, что могу просто использовать внешние ключи на таблицах учеников и учителей. Благодарю. –