Laravel Eloquent:模型关系的错误键名

时间:2018-09-07 19:25:44

标签: php laravel eloquent

我制作了一个Models控制器,并将其用作几乎所有Model的资源。现在,当我尝试获取模型和相关模型的数据时,Laravel用下划线和小写字母替换了大写字母。我需要使用大写字母。

在App \ Models \ Rate中有一个模型可以解决这个问题:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Rate extends Model
{

    use SoftDeletes;
    protected $dates = ['deleted_at'];
    protected $table = 'rates';

    protected $fillable = [
        'institution_id',
        'name',
    ];

    protected $info = [
        'relations' => [
            'rateRistournes' => [
                'model' => 'RateRistourne',
                'type' => 'hasMany',
            ],
            'rateRows' => [
                'model' => 'RateRow',
                'type' => 'hasMany',
            ],
            'rateTables' => [ 
                'model' => 'RateTable',
                'type' => 'hasMany',
            ],
        ],
        'rules' => [
        ],
        'hashid' => false,
    ];

    public function getRelations()
    {
        return $this->info['relations'];
    }

    public function getRules()
    {
        return $this->info['rules'];
    }

    public function useHashid()
    {
        return $this->info['hashid'];
    }

    public function institution()
    {
        return $this->belongsTo(Institution::class);
    }

    public function rateTables()
    {
        return $this->hasMany(RateTable::class);
    }

    public function rateRows()
    {
        return $this->hasMany(RateRow::class);
    }

    public function rateRistournes()
    {
        return $this->hasMany(RateRistourne::class);
    }
}

这是包含查询到ModelsController的函数:

public function show($name, $id)
{
    $data = $this->retrieveModelAndRelations($name, $id);

    if (is_null($data)) {
        return $this->sendError('Model not found.');
    }

    return $this->sendResponse($data->toArray(), 'Model retrieved successfully.');
}


private function retrieveModelAndRelations($name, $id)
{
    $modelName = 'App\Models\\'.$name;
    $model = new $modelName;

    if ($id === 'null') {
        ...
    } else {
        $data = $modelName::when(isset($model->getRelations()['customer']), function($query) {
                            return $query->with('customer');
                        })...
                        })->when(isset($model->getRelations()['rateTables']), function($query) {
                            return $query->with(array('rateTables' => function($q) {
                                $q->orderBy('cashStart', 'ASC');
                            }));
                        })->when(isset($model->getRelations()['rateRows']), function($query) {
                            return $query->with(array('rateRows' => function($q) {
                                $q->orderBy('rate', 'ASC');
                            }));
                        })->when(isset($model->getRelations()['rateRistournes']), function($query) {
                            return $query->with(array('rateRistournes' => function($q) {
                                $q->orderBy('ristourne', 'ASC');
                            }));
                        })->find($id);
    }

    return $data;
}

结果进入控制台:

created_at:(...)
deleted_at:(...)
id:(...)
institution_id:(...)
name:(...)
rate_ristournes:Array(1)
rate_rows:Array(1)
rate_tables:Array(1)

最后3行应为:

rateRistournes:Array(1)
rateRows:Array(1)
rateTables:Array(1)

有没有办法在我编写时强制laravel保持关系键? 隐藏在外的东西更改了名称,我不知道如何绕过它。

1 个答案:

答案 0 :(得分:2)

更改$snakeAttributes

class Rate extends Model
{
    public static $snakeAttributes = false;
}