Я новичок в Laravel и в качестве своего первого проекта я пытаюсь создать API для опроса.
Я изо всех сил пытаюсь создать модель и контроллер для типов ответов, после того, как посмотрел его о своемвопрос, который я узнал о полиморфных отношениях, и это в какой-то мере отвечает тому, что мне нужно. Адам Уотхэм снял хорошее видео о модели и типах моделей, но не говорит о его создании.
Ссылка на видео: https://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/
МОДЕЛИ
Я создал модель для ответов и типов ответов, и мне пришлось добавить тип атрибута в Ответы , потому что я должен заранее знать, какой это тип. Я решил добавить morphTo на модель типа, потому что я хочу, чтобы ни один или много Типы (текст, число) в моем ответе:
class NumberAnswer extends Model
{
protected $fillable = [
'number'
];
public function numberable()
{
$this->morphTo();
}
}
class TextAnswer extends Model
{
protected $fillable = [
'text'
];
public function textable()
{
$this->morphTo();
}
}
class Answer extends Model
{
protected $fillable = [
'user_id',
'question_id',
'type'
];
public function numbers()
{
$this->morphMany('App\Models\File', 'numberable');
}
public function texts()
{
$this->morphMany('App\Models\Text', 'textable');
}
}
У меня возникают проблемы с тем, какхраните их, как я делаю в настоящее время и где я нашел несколько советов:
Полиморфное решение для контроллера, которое я нашел
Поставщик услуг
public function boot()
{
Relation::morphMap([
'answer' => 'App\Models\Answer'
]);
}
AnswerController
class AnswerController extends Controller
{
private $answer;
public function __construct(AnswerRepository $answerRepo)
{
$this->answer = $answerRepo;
}
public function store(Request $request, int $tenantId)
{
$requestAnswer = $request->validate([
'user_id' => [
'required',
'numeric',
Rule::exists('users','id'),
],
'question_id' => [
'required',
'numeric',
Rule::exists('questions','id'),
],
'type' => [
'required',
'in:text,number'
]
]);
$text = $request->validate([
'text' => 'required_if:type,text|string',
]);
$number = $request->validate([
'number' => 'required_if:type,number|string',
]);
$answer = $this->answer->create($requestAnswer);
if($requestAnswer['type'] === 'text'){
$answer->texts()->create(['text' => $text]);
}
if($requestAnswer['type'] === 'number'){
$answer->numbers()->create(['number' => $number]);
}
return response()->json($answer);
}
}
ВОПРОС
Я немного растерялся из-за того, что мне делать, потому что во время обучения я хочу знать, есть ли другой способ, которого я не вижу. Есть лучший способ добиться этого?