【问题标题】:Laravel Lighthouse GraphQL renamed relationship mutationLaravel Lighthouse GraphQL 重命名关系突变
【发布时间】:2020-05-01 11:28:27
【问题描述】:

我在使用 graphQL 查询更新重命名关系时遇到问题。

以下是相关的架构和 Laravel 模型:

Laravel 模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Lead extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    // protected $fillable = [
    //     'lead_type_id',
    // ];

    protected $guarded = [];
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        //
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        // 'created_at' => 'timestamp',
        // 'updated_at' => 'timestamp'
    ];

    /**
     * Get the LeadActions for the Lead.
     */
    public function leadActions()
    {
        return $this->hasMany(\App\Models\LeadAction::class);
    }

    /**
     * Get the clients for the Lead.
     */
    public function clients(): BelongsToMany
    {
        return $this->belongsToMany(Client::class);
    }

    /**
     * Get the LeadType for the Lead.
     */
    public function leadType(): BelongsTo
    {
        return $this->belongsTo(\App\Models\LeadType::class, 'lead_type_id');
    }
}

?>

<?php

namespace App\Models;

use App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class LeadType extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        //
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'name' => 'string',
        'created_at' => 'timestamp',
        'updated_at' => 'timestamp'
    ];

    /**
     * Get the Leads for the LeadType.
     */
    public function leads(): HasMany
    {
        return $this->hasMany(Models\Lead::class);
    }

}
?>

GraphQl 架构

type Lead {
   id: ID!
   lead_type: LeadType @belongsTo(relation: "leadType")
   clients: [Client!]! @belongsToMany
   created_at: DateTime!
   updated_at: DateTime!
}
input UpdateLeadInput {
   id: ID!
   clients: UpdateClientsRelation
   lead_type: UpdateLeadTypeRelation
}
input UpdateLeadTypeRelation {
   create: CreateLeadTypeInput
   connect: ID
   update: UpdateLeadTypeInput
   upsert: UpsertLeadTypeInput
   delete: ID
   disconnect: ID
}

使用以下 graphQl 查询,我得到一个缺少列 Lead_type 的 SQL 错误: 查询

mutation UpdateLead {
  updateLead(input: {id: 1, lead_type: {connect: 1}}) {
    id
    clients {
      id
      name
    }
    lead_type {
      id
      name
    }
  }
}

SQL 错误

Column not found: 1054 Unknown column 'lead_type' in 'field list' (SQL: update `leads` set `lead_type` = {\"connect\":\"1\"}, `leads`.`updated_at` = 2020-01-14 17:11:17 where `id` = 1

我遵循 Laravel 命名约定,并在潜在客户表上命名了lead_type_id 列。如果我删除将lead_type 关系重命名为leadType,我可以成功运行更新突变,但我不知道如何让它使用正确的列名称(lead_type_id),同时保持关系重命名。

非常感谢任何帮助。

非常感谢

【问题讨论】:

    标签: php mysql laravel graphql laravel-lighthouse


    【解决方案1】:

    您尝试过@rename 指令吗?我的意思是你必须在你的UpdateLeadInput 中的lead_type 上使用它,因为灯塔会查找名为lead_type 的关系,并且由于没有定义,它假定lead_type 是一个参数。

    重命名模型中的关系,例如:

    class Lead extends Model
    {
        public function lead_actions()
        {
            return $this->hasMany(\App\Models\LeadAction::class);
        }
    
        public function lead_type(): BelongsTo
        {
            return $this->belongsTo(\App\Models\LeadType::class, 'lead_type_id');
        }
    }
    

    使用@rename 指令(我没有尝试过,但我的意思是它是这样工作的):

    input UpdateLeadInput {
       id: ID!
       clients: UpdateClientsRelation
       lead_type: UpdateLeadTypeRelation @rename(attribute: "leadType")
    }
    

    【讨论】:

    • 谢谢,重命名指令正是我所缺少的。我设法在文档中错过了这个指令,我的 IDE 也没有将它识别为有效指令。
    • 哦,好的,@rename 指令是 documented in API Reference。也许我们必须在其他地方提到它?欢迎您在 github repo 中添加问题并提出建议,我们可以将其放置在哪里。
    猜你喜欢
    • 2022-07-12
    • 2020-04-20
    • 2020-04-25
    • 2020-12-25
    • 2018-06-20
    • 2018-07-08
    • 2020-05-11
    • 2020-08-11
    • 2020-01-18
    相关资源
    最近更新 更多