在字符串上调用成员函数 addEagerConstraints() - Laravel 8

Call to a member function addEagerConstraints() on string - Laravel 8

我想通过 type_name 属性 获得响应,而不在 table

中添加新字段
{
  "status": 200,
  "message": "OK",
  "data": {
    "id": 23,
    "uuid": "9b1d33f9-0e44-4161-9936-ec41309697a5",
    "sender_id": null,
    "receiver_id": 2,
    "type": 0,
    "coin": 200,
    "balance": 27000,
    "description": "Topup 200 coin",
    "type_name": "Topup"
}

因此我尝试在 CoinTransaction 模型中创建一个名为 typeName() 的方法,希望可以通过 with() 方法调用该方法:

$transaction = CoinTransaction::create([
     'receiver_id'   => auth()->user()->id,
     'coin'          => $request->coin,
     'balance'       => $predefineCoin->balance ?? 1000,
     'type'          => 0,
     'description'   => $request->description
]);

$transaction = CoinTransaction::with(['typeName'])->find($transaction->id);

但这是 return 一个错误:

Error: Call to a member function addEagerConstraints() on string...

在我的 CoinTransaction 模型中

class CoinTransaction extends Model
{
    use HasFactory;

    protected $guarded  = ['id'];


    public function sender() {
        return $this->belongsTo(User::class, 'sender_id');
    }


    public function receiver() {
        return $this->belongsTo(User::class, 'receiver_id');
    }


    public function typeName() {
        $typeName = null;

        switch($this->type){
            case 0: $typeName = 'Topup'; break;
            default: $typeName = 'Unknown';
        }

        return $typeName;
    }
}

typeName 不是 relationship method 所以你有 typeName() 如下所示

$coin=CoinTransaction::find($transaction->id); 
dd($coin->typeName());

要将 type_name 属性添加到现有响应,您可以使用 Mutators

参考:https://laravel.com/docs/8.x/eloquent-mutators#accessors-and-mutators

所以在下面添加 属性 和 CoinTransaction

中的方法
protected $appends = ['type_name'];

和方法

public function getTypeNameAttribute()
{
    $typeName = null;

        switch($this->type){
            case 0: $typeName = 'Topup'; break;
            default: $typeName = 'Unknown';
        }

        return $typeName;    
}

所以在控制器中

$transaction = CoinTransaction::find($transaction->id);