如何让 Laravel 资源使用多态关系

wiwa1978

我在 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_idratable_type因为我已经在控制器代码中填写了这些。

我以某种方式需要传递资源,它是一个ProductUser我正在给它评分的资源。

我怎样才能使这项工作?

橄榄树

该问题可能是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Laravel 5.2中使用多对多态关系

来自分类Dev

Laravel:如何使用多态关系雄辩模型从表中轻松获取值?

来自分类Dev

如何为belongsTo创建Laravel资源关系?

来自分类Dev

如何在Laravel中保存多对多态关系中的条目?

来自分类Dev

Laravel 5.6 如何获取模型的多态关系,返回null

来自分类Dev

Laravel 5多态关系

来自分类Dev

多态关系在Laravel 6

来自分类Dev

Laravel多态关系

来自分类Dev

Laravel 5.3多态关系

来自分类Dev

如何通过Laravel中的hasMany关系对一对一多态关系列求和?

来自分类Dev

使用雄辩的多态关系对Laravel中的数据进行分类

来自分类Dev

使用完整模型名称的 Laravel 多态关系

来自分类Dev

如何在laravel中使用简单的关系

来自分类Dev

如何使用Laravel Eloquent返回多个关系?

来自分类Dev

我如何在Laravel中使用关系?

来自分类Dev

如何使用Laravel Eloquent返回多个关系?

来自分类Dev

如何使用laravel关系过滤查询

来自分类Dev

Laravel哪里有多态关系

来自分类Dev

Laravel 4:保存多态关系

来自分类Dev

Laravel渴望加载多态关系

来自分类Dev

Laravel哪里有多态关系

来自分类Dev

Laravel渴望加载多态关系

来自分类Dev

在Laravel中保存多态关系

来自分类Dev

Laravel - 返回分组的多态关系

来自分类Dev

Laravel 多态有多种关系

来自分类Dev

如何在 Laravel 5.6 中添加多于两列来处理多态关系

来自分类Dev

通过多态使用Laravel Eloquents HasManyThrough关系和多个关系

来自分类Dev

如何创建多态关系的种子

来自分类Dev

如何覆盖 Laravel 资源路由?