1

Я использую laravel 5.1. Сценарий выглядит следующим образом (это пример. Реальный сценарий похож на данном примере)Laravel-Many-to-one Полиморфное отношение

У меня есть 3 модели

  1. колледжа
  2. Студент
  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 я могу использовать в модели студента, чтобы иметь возможность получить значение колледжа студента, поддерживая отношения как один-ко-многим?

Любая помощь была бы действительно оценена. Благодарю.

+0

Я думаю, что вы все испортили, и вам не нужны Полиморфные отношения в вашем случае. – fico7489

+0

@MikelBitson, спасибо. Я использовал функции morphOne-morphTo и morphMany-morphTo для отношений «один к одному» и «один ко многим». Функция в колледже используется в этих сценариях, но она не работает для моего сценария. –

+0

@ fico7489, да, я действительно на этапе планирования, и мне просто интересно, возможно ли это. Я понимаю, что могу просто использовать внешние ключи на таблицах учеников и учителей. Благодарю. –

ответ

3

Здесь нет причин использовать Полиморфные отношения. Вместо этого просто добавьте внешний ключ в таблицу colleges на оба таблицы students и teachers. Как это:

colleges 
    id 
    name 

teachers 
    id 
    name 
    college_id 

students 
    id 
    name 
    college_id 

Тогда ваши модели могут использовать belongsTo() и hasMany() отношение, например, так:

class College extends Model { 
    public function students() { 
     return $this->hasMany(App\Student::class); 
    } 

    public function teachers() { 
     return $this->hasMany(App\Teacher::class); 
    } 
} 

class Teacher extends Model { 
    public function colleges() { 
     return $this->belongsTo(App\College::class); 
    } 
} 

class Student extends Model { 
    public function colleges() { 
     return $this->belongsTo(App\College::class); 
    } 
} 

Полиморфных один-ко-многим отношение к противоположному этому отношению, где у вас есть модель который может быть связан только с одной записью, но в этой записи может быть много разных моделей.

Редактировать: Чтобы пояснить, почему полиморфные отношения здесь не нужны, давайте посмотрим, где это будет необходимо. Скажем, у вас простой веб-сайт на основе CRM. Есть клиенты и проекты, и вы хотите получать комментарии к обоим. В этом случае вы будете делать комментарии полиморфными отношениями, потому что комментарии принадлежат одному клиенту или одному проекту, но не оба.

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

+0

спасибо за разъяснение. Ваше последнее утверждение именно то, что я искал, то есть полиморфные отношения не применимы для моего сценария. Я собирался пойти на тот же метод внешнего ключа, который вы предложили выше, но просто задавался вопросом, будут ли полиморфные отношения работать. В любом случае, есть ли особая причина, почему мой сценарий не подходит для полиморфных отношений «один ко многим»? –

+0

@SaurabhMisra См. Редактировать Я только что сделал –

+0

ОК, это имеет смысл. Спасибо Джошу. –

Смежные вопросы