我在 Laravel 应用程序中有一个多态关系。我希望网站的用户能够对User
模型和Product
模型进行评分。
我有以下模型和关系
class Rating extends Model
{
public function ratable()
{
return $this->morphTo();
}
}
class User extends Authenticatable
{
public function ratings()
{
return $this->morphMany('App\Rating', 'ratable');
}
}
class Product extends Model
{
public function ratings()
{
return $this->morphMany('App\Rating', 'ratable');
}
}
以及以下数据库迁移:
class CreateRatingsTable extends Migration
{
public function up()
{
Schema::create('ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('ratable_id');
$table->string('ratable_type');
$table->double('rating');
$table->text('comment');
$table->timestamps();
});
}
}
我定义了两条路线:
1) Route::post('products/{product}/rating', 'ProductController@setRating')->name('products.rating');
2) Route::post('users/{user}/rating', 'UserController@setRating')->name('users.rating');
我在控制器中有以下代码(只会显示产品示例)
public function setRating(Request $request, Product $product)
{
$rating = new Rating();
$rating->rating = $request->rating;
$rating->comment = $request->comment;
$product->ratings()->save($rating);
}
以上工作完美,正确的记录插入到数据库中,具体取决于是调用 Product 路由还是 User 路由。
现在,我的所有其余代码都使用 Laravel 资源,出于一致性原因,我还为 定义了一个资源Rating
:
class RatingResource extends JsonResource
{
public function toArray($request)
{
return [
'ratable_id' => $this->ratable_id,
'ratable_type' => $this->ratable_type,
'rating' => $this->rating,
'comment' => $this->comment
];
}
}
我也在更改ProductController
代码以使用此资源
public function setRating(Request $request, Product $product)
{
return new RatingResource(Rating::create([
'ratable_id' => $product->id,
'ratable_type' => $product,
'rating' => $request->rating,
'comment' => $request->comment,
]));
}
在邮递员中,我正在调用 REST API:
http://{{url}}/api/products/1/rating with body:
rating: 4
comment: "Test"
但是,我总是收到以下错误消息
"SQLSTATE[HY000]: 一般错误: 1364 字段 'ratable_id' 没有默认值 (SQL: insert into
ratings
(rating
,comment
,updated_at
,created_at
) values (4, test, 2019-09-07 13:44:22, 2019- 09-07 13:44:22))"
我没有通过ratable_id
,ratable_type
因为我已经在控制器代码中填写了这些。
我以某种方式需要传递资源,它是一个Product
或User
我正在给它评分的资源。
我怎样才能使这项工作?
该问题可能是ratable_id
由失踪$fillable
。
尝试$product->ratings()->create([...data...])
这样您就不必设置ratable_id
和您ratable_type
自己:
public function setRating(Request $request, Product $product)
{
return new RatingResource(
$product->ratings()->create([
'rating' => $request->rating,
'comment' => $request->comment,
])
);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句