我目前在与Laravel 4的n:n关系方面遇到问题,我在使用数据透视表时出现错误,该表在两个组件上以单数名称查询 . 我创建了一个数据透视表lands_objs并填充它:
Models are:
<?php
class Obj extends Eloquent
{
protected $guarded = array();
public static $rules = array();
public $timestamps = false;
public function land()
{
return $this->belongsToMany('Land');
}
<?php
class Land extends Eloquent
{
protected $guarded = array();
public static $rules = array();
public $timestamps = false;
public function objs()
{
return $this->belongsToMany('Obj');
}
}
以下是我按照标准填充数据透视表的方法 . 当然存在land,objs和lands_objs表:
<?php
use Illuminate\Database\Migrations\Migration;
class CreateLandsObjsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('lands_objs', function($table) {
$table->integer('land_id');
$table->integer('obj_id');
});
}
}
有了这个结构,我应该能够感谢Eloquent:
$land = Land::find(1); //checked loads land fine
$objs = $land->objs; //--> HERE I TAKE THE ERROR
但我接受了错误:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'taylor.land_obj' doesn't exist
(SQL: select `objs`.*, `land_obj`.`land_id` as `pivot_land_id`, `land_obj`.`obj_id`
as `pivot_obj_id` from `objs` inner join `land_obj` on `objs`.`id` = `land_obj`.`obj_id`
where `land_obj`.`land_id` = ?) (Bindings: array ( 0 => 1, ))
即使在land_obj上查询,Laravel也不应该创建表lands_objs吗?我错过了什么吗?
非常感谢 .
1 回答
数据透视表应该是它所链接的表名的单数形式,按字母顺序排列,因此在您的情况下:
land_obj而不是lands_objs
如果您确实不想使用默认命名约定,还可以将表名指定为模型中belongsToMany调用的第2个参数:
和
有关更多信息,请参阅docs here