【问题标题】:Save a model and return its' relationships保存模型并返回其关系
【发布时间】:2020-06-19 16:05:53
【问题描述】:

在我的代码库中,我有一个资产模型和一个技术模型,

资产模型是可变形的,

public function assetable() {
    return $this->morphToMany();
}

和技术模型也有关系,

public function asset() {
    return $this->morphOne(Asset::class, 'assetable');
}

在我的控制器中,我正在执行以下操作,

public function create(Request $request) {

    //Do validation

    \DB::beginTransaction();

    try {
        $technology = Technology::create([
            'technology' => $request->name,
            'type' => 'payment'
        ]);
    } catch(\Exception $e) {
        \DB::rollback();
        throw($e);
    }

    try {
        //update the already uploaded asset so it relates to the newly created Technology
        $assets = Asset::whereIn('id', $request->uploadedFile)->update([
            'assetable_id' => $technology->id,
            'assetable_type' => 'App\Payment'
        ]);
    } catch(\Exception $e) {
        \DB::rollback();
        throw($e);
    }

    \DB::commit();
    return response(['technology' => $technology->load('asset')], 201);
}

我想返回新创建的技术资产,并将资产关系作为结果的一部分,但它返回为空,

我做错了什么?确定不需要requry数据库吧?

【问题讨论】:

  • 需要重新查询数据库。 Asset::update([ ... ]) 进行 SQL 查询 UPDATE assets SET ... 这不是一个将返回受影响行的查询
  • 为什么要把变形的类类型设置为App\Payment?当它尝试加载asset 关系时,它将无法加载Technology,因为Asset 与它无关……Asset 与某个名为App\Payment 的模型相关与Technology 相同的“id”...除非Technology 这是您的Payment 类的别名?
  • @lagbox facepalm 哦!谢谢哥们!

标签: php laravel eloquent polymorphism


【解决方案1】:

在 Model Technology.php 中建立关系

public function asset(){
   $this->hasMany(Asset::class)
}

在 Model Asset.php 中建立关系

public function technology(){
   $this->belongsTo(Technology::class)
}

在控制器中

public function create(Request $request) {

    //Do validation

    \DB::beginTransaction();

    try {
        $technology = Technology::create([
            'technology' => $request->name,
            'type' => 'payment'
        ]);

        //update the already uploaded asset so it relates to the newly created Technology
        $assets = Asset::whereIn('id', $request->uploadedFile)->update([
            'assetable_id' => $technology->id,
            'assetable_type' => 'App\Payment'
        ]);

    } catch(\Exception $e) {
        \DB::rollback();
        throw($e);
    }

    \DB::commit();
    return response(['technology' => $technology->asset], 201);
}

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 2015-04-14
    • 2021-11-11
    • 1970-01-01
    • 2016-06-09
    • 2016-01-23
    • 2015-04-18
    • 2017-01-01
    相关资源
    最近更新 更多