Laravel外键更改为小写

时间:2015-09-13 20:18:37

标签: php laravel laravel-4 laravel-5

我试图访问关系字段值,当我试图这样做时,我得到了错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sub_areas.subarea_id' in 'where clause' (SQL: select * from {sub_areas {1}} {sub_areas {1}} {subarea_id {1}}

我无法理解为什么要用下划线将其更改为较低的键;

感谢任何帮助。

访问模型:

where

在Model中,主键是:

城市模型:

.

SubArea Model

is null limit 1)

迁移:

$subArea = City::find(1)->subArea;

添加外键:

/**
* Overriding default Primary Key
* @var string
*/
protected $primaryKey = 'SubAreaID';

public function subArea()
{
    return $this->belongsTo(SubArea::class);
}

如果我在这个函数中传递外键

CityModel

public function city()
{
     return $this->hasMany(City::class);
}

SubArea Model

     Schema::create('cities', function (Blueprint $table) {

        $table->engine = 'InnoDB';

        $table->increments('Id');
        $table->integer('AreaID')->unsigned();
        $table->integer('SubAreaID')->unsigned();
        $table->integer('CityID')->unsigned()->index();
        $table->string('Title', 50);
        $table->string('Latitude', 100);
        $table->string('Longitude', 100);            
        $table->tinyInteger('Active')->unsigned()->default(1);
    });

我没有得到任何结果。 但这还有一个问题。

1 个答案:

答案 0 :(得分:3)

首先,根据您的迁移,City模型的主键不是SubAreaID。它只是Id。将其分配到SubAreaID实际上会导致find(1)查找SubAreaID为1的列,我不相信您正在尝试这样做。

现在,默认情况下,当您定义belongsTo关系时,Laravel具有默认命名约定。

  

按照惯例,Eloquent将采取"蛇案"   拥有模型的名称,并以_id为后缀。   http://laravel.com/docs/5.1/eloquent-relationships

在这种情况下,当您在$this->belongsTo(SubArea::class)中定义City时,它会假定您在subarea_id模型中有City列。

但是,您可以通过将自定义键作为第二个参数传递来覆盖此行为。

public function subArea()
{
    return $this->belongsTo(SubArea::class, 'SubAreaID');
}

同样,在您的SubArea模型中

public function city()
{
     return $this->hasMany(City::class, 'SubAreaID');
}

最后,最后两个关系

  

CityModel

return   $this->hasOne(SubArea::class, 'SubAreaID');
     

SubArea Model

return $this->belongsToMany(\City::class, 'cities', 'SubAreaID');

不会工作,因为根本不是你的桌子的设置方式。