Я могу найти ряд обсуждений по этому вопросу, но не ясное решение. Вот две ссылки, хотя я расскажу все в своем собственном вопросе здесь.
Простое объяснение
Это простое объяснение моей проблемы для любого, кто уже знаком с полиморфными отношениями Laravel.
При использовании $morphClass содержимое $morphClass, которое сохраняется в базе данных как тип морфинга, используется для имени класса при попытке найти владельца полиморфного отношения. Это приводит к ошибке, так как вся точка $morphClass заключается в том, что она не является полностью именным именем класса.
Как вы определяете имя класса, которое должно использовать полиморфное отношение?
Подробное пояснение
Это более подробное объяснение, объясняющее, что именно я пытаюсь сделать, и почему я пытаюсь сделать это с примерами.
При использовании Полиморфных отношений в Laravel независимо от того, что сохраняется, поскольку тип "morph_type" в базе данных считается классом.
Итак, в этом примере:
class Photo extends Eloquent {
public function imageable()
{
return $this->morphTo();
}
}
class Staff extends Eloquent {
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
class Order extends Eloquent {
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
База данных будет выглядеть так:
staff
- id - integer
- name - string
orders
- id - integer
- price - integer
photos
- id - integer
- path - string
- imageable_id - integer
- imageable_type - string
Теперь первая строка фотографий может выглядеть так:
идентификатор, путь, imageable_id, imageable_type
1, image.png, 1, персонал
Теперь я могу либо получить доступ к Photo из модели Staff, либо к сотруднику из фотомодели.
//Find a staff member and dump their photos
$staff = Staff::find(1);
var_dump($staff->photos);
//Find a photo and dump the related staff member
$photo = Photo::find(1);
var_dump($photo->imageable);
Пока все хорошо. Однако, когда я их простаиваю, я сталкиваюсь с проблемой.
namespace App/Store;
class Order {}
namespace App/Users;
class Staff {}
namespace App/Photos;
class Photo {}
Теперь, что сохранено в моей базе данных:
идентификатор, путь, imageable_id, imageable_type
1, image.png, 1, App/Пользователи/Staff
Но я не хочу этого. Это ужасная идея иметь полные имена имен имен, сохраненные в базе данных!
К счастью, Laravel имеет возможность установить переменную $morphClass. Например:
class Staff extends Eloquent {
protected $morphClass = 'staff';
public function photos()
{
return $this->morphOne('Photo', 'imageable');
}
}
Теперь строка в моей базе данных будет выглядеть так, что это потрясающе!
идентификатор, путь, imageable_id, imageable_type
1, image.png, 1, персонал
И получение фотографий сотрудника работает абсолютно нормально.
//Find a staff member and dump their photos
$staff = Staff::find(1);
//This works!
var_dump($staff->photos);
Однако полиморфная магия поиска владельца фотографии не работает:
//Find a photo and dump the related staff member
$photo = Photo::find(1);
//This doesn't work!
var_dump($photo->imageable);
//Error: Class 'staff' not found
Предположительно, должен быть способ сообщить полиморфные отношения того, какое имя класса использовать при использовании $morphClass, но я не могу найти никакой ссылки на то, как это должно работать в документах, в исходном коде или через Google.
Любая помощь?