Laravel |Полиморфная связь неизвестная колонка - PullRequest
0 голосов
/ 25 мая 2018

Я впервые использую полиморфные отношения.

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

Я создал 4 таблицы.

Пользователи: | id | username | password | created_at | updated_at |

Команды: | id | friendly_name | slug |

Пользователь команды: | id | user_id | team_id |

Распределение назначений:

| id | assignment_id | assignmentable_type | assignmentable_id | created_at | updated_at

Поэтому, когда в assignment_allocations есть данные, оно выглядит следующим образом ...

| id | assignment_id | assignmentable_type | assignmentable_id | | 1 | 1 | App\Models\User | 1 |

Однако я получаю эту ошибку:

SQL: выберите * из users, где users. assignmentable_id = 1 и users. assignmentable_idне равно NULL и users. assignmentable_type = App \ Models \ User

ТАК, очевидно, я сделал что-то не так, однако я не могу понять, что сделал неправильно.

Это мои функции, которые относятся к этому:

AssignmentAllocation.php

public function assignmentable()
{
    return $this->morphTo();
}

User.php

public function assignments()
{
    return $this->morphMany('App\Models\User', 'assignmentable');
}

Team.php

public function assignments()
{
    return $this->morphMany('App\Model\Team', 'assignmentable');
}

Любая помощь очень признательнаТэд.

1 Ответ

0 голосов
/ 25 мая 2018

Существует 2 возможных ответа в зависимости от вашей структуры данных, что не ясно из вашего вопроса.

  1. User / Team до Assignmentотношение ко многим (у каждого Assignment есть один User / Team, а у каждого User / Team есть множество Assignments

  2. многие ко многимотношения, в которых каждый User / Team имеет множество Assignments, а каждый Assignment имеет множество Users / Teams


Один ко многим

В случае «один ко многим» вам не понадобится таблица Assignment и * AssignmentAllocation, поэтому я предполагаю, что ваша AssignmentAllocation - ваша *Модель 1038 *. Если нет, то вместо таблицы нужно поставить столбцы assignmentable_type и assignmentable_id в таблицу assignments и использовать Assignment.php вместо AssignmentAllocation.php.

AssignmentAllocation.php

public function assignmentable()
{
    return $this->morphTo();
}

User.php

public function assignments()
{
    return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}

Team.php

public function assignments()
{
    return $this->morphMany('App\Models\AssignmentAllocation', 'assignmentable');
}

Ваша ошибка в том, что Laravel ищет в таблице users соответствие (у вас есть morphMany('User'..), когда он должен искать в таблице AssignmentAllocation. Так что просто отключите их.

1) morphMany действуеткак hasMany, так что вы говорите:

Каждый User hasMany Assignment с и каждый Team hasMany Assignments.В первой части morphMany написано «поиск по таблице AssignmentAllocation», а во второй части «поиск по assignmentable _id и assignmentable _type, равным этому экземпляру этой модели».

2) morphTo действует как belongsTo, так что вы говорите:

Каждый Assignment belongsTo assignmentable.


Много ко многим

Однако, если AssignmentAllocation является сводной таблицей "многие ко многим", и у каждого Assignment есть много Users или Teams, а у каждого User / Team есть много Assignments, тогда вам нужна пара morphToMany / morphedByMany.

User.php

public function assignments()
{
    return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}

Team.php

public function assignments()
{
    return $this->morphToMany('App\Models\Assignment', 'assignmentable');
}

Assignment.php модель ПРИМЕЧАНИЕ: не модель AssignmentAllocation

public function users()
{
    return $this->morphedByMany('App\Models\User', 'assignmentable');
}

public function teams()
{
    return $this->morphedByMany('App\Models\Team', 'assignmentable');
}

Вам следует переименовать таблицу assignment_allocation в assignmentables или добавить требуемые третий и четвертый аргументы в функции morph.Я предпочитаю, чтобы имена таблиц были согласованными.

...