【发布时间】:2019-10-18 20:05:05
【问题描述】:
我是 Laravel 的新手,作为我的第一个项目,我正在尝试制作一个调查 API。
我正在努力为答案类型创建模型和控制器,在查看了我的问题后,我发现了多态关系,这在一定程度上满足了我的需求。 Adam Watham 制作了一个关于模型和模型类型的精彩视频,但没有谈到创建它。
视频链接:https://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/
型号
我为答案和答案类型创建了一个模型,并且必须在 Answers 上添加一个属性类型,因为我必须事先知道它是什么类型。我选择在类型模型上添加 morphTo 是因为我不想在我的答案中添加一个或多个 Types(text,number):
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');
}
}
我遇到的问题是如何存储它们,我目前的工作方式以及我在哪里找到了一些提示:
Polymorphic controller solution that I found
服务提供者
public function boot()
{
Relation::morphMap([
'answer' => 'App\Models\Answer'
]);
}
应答控制器
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);
}
}
问题
我对我应该做什么有点迷茫,因为在我学习的过程中,我想知道是否还有其他我看不到的方法。有更好的方法来实现这一点吗?
【问题讨论】:
标签: laravel postgresql model-view-controller polymorphism