我对方法 HasManyThrough 感到困惑。在我的view / cars / index.php文件中,我想获取ID,入学名,姓名(fk_serie),name_mark。 我收到一条错误消息“ SQLSTATE [42S22]:找不到列:1054 Champ'marks.fk_serie'inconnu dans on子句”?
我实际上有3个表: 第一个叫 cars ,我有3个字段id,matriculation,fk_serie。
我的第二张表名为 series ,我有3个字段,分别是id,name,fk_mark。
我的上一张表名为标记,我有2个字段ID,即name_mark。
我知道要加入汽车到系列或系列到标记的表格,但是我不明白如何在表格汽车和表格标记之间建立连接。
第一个问题,我必须在桌子汽车上创建一个fk_mark吗?
public function up()
{
Schema::create('cars', function (Blueprint $table) {
$table->increments('id');
$table->string('matriculation', 25);
$table->integer('fk_serie')->unsigned();
$table->foreign('fk_serie')->references('id')->on('serie');
$table->timestamps();
});
}
其他表格
public function up()
{
Schema::create('series', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 30);
$table->integer('fk_mark')->unsigned();
$table->foreign('fk_mark')->references('id')->on('mark');
$table->timestamps();
});
}
public function up()
{
Schema::create('marks', function (Blueprint $table) {
$table->increments('id');
$table->string('name_mark', 30);
$table->timestamps();
});
}
第二个问题:我的模型可以吗?请。
模型车
class Car extends Model
{
//
public function serie(){
return $this->belongsTo('App\Serie', 'fk_serie');
}
public function mark()
{
return $this->hasManyThrough(
'App\Serie',
'App\Mark',
'fk_serie', // Foreign key on posts table...
'fk_mark', // Foreign key on users table...
'id', // Local key on countries table...
'id' // Local key on users table...
);
}
}
模型系列
class Serie extends Model
{
//
public function mark(){
return $this->belongsTo('App\Mark', 'fk_mark');
}
}
模型标记
class Mark extends Model
{
//
}
第三个问题:根据您的要求,我的循环是否还可以?
在我的 view / cars / index.php 中,我有以下内容:
<tr>
<th>Matriculation</th>
<th>Serie car</th>
<th>Mark car</th>
</tr>
</thead>
@foreach($cars as $car)
<tr>
<td> {{$car->matriculation}}</td>
<td> {{$car->serie->name}}</td>
<td> {{$car->mark->name_mark}}</td>
etc...
感谢您的帮助。
CarController
class CarController extends Controller
{
public function index()
{
$cars = Car::oldest()->paginate(5);
return view('admin.cars.index', compact('cars'))
->with('i', (request()->input('page', 1)-1)*5);
}
}
编辑:好的,非常感谢Lucas Piazzi。
答案 0 :(得分:2)
汽车和 Mark 之间的关系是错误的,HasManyThrought关系应该在Mark模型上,请尝试以下操作:
汽车型号:
class Car extends Model
{
//
public function serie(){
return $this->belongsTo('App\Serie', 'fk_serie');
}
}
标记模型:
public function cars()
{
return $this->hasManyThrough(
'App\Car',
'App\Serie',
'fk_mark',
'fk_serie',
'id',
'id'
);
}
public function series()
{
return $this->hasMany('App\Serie','fk_mark');
}
如果需要,您还可以访问Mark模型中具有Has many Through关系的所有汽车。
看看这篇文档:
传递给hasManyThrough方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称。
典型的雄辩外键约定将在执行关系的查询时使用。如果您想自定义关系的键,可以将它们作为hasManyThrough方法的第三个和第四个参数传递。第三个参数是中间模型上外键的名称。第四个参数是最终模型上外键的名称。第五个参数是本地键,而第六个参数是中间模型的本地键:
您在模型中缺少逆关系:
意甲型号:
class Serie extends Model
{
public function mark(){
return $this->belongsTo('App\Mark', 'fk_mark');
}
public function cars(){
return $this->hasMany('App\Car', 'fk_serie');
}
}
回答您的问题:
否,您不需要在fk_mark
表中创建cars
,如果您想要属于汽车的标记名称,只需执行以下操作:< / p>
在您的视图
中<tr>
<th>Matriculation</th>
<th>Serie car</th>
<th>Mark car</th>
</tr>
@foreach($cars as $car)
<tr>
<td> {{$car->matriculation}}</td>
<td> {{$car->serie->name}}</td> // or {{$car->series()->first()->name}}
<td> {{$car->serie->mark->mark_name}}</td> // or {{$car->series()->first()->marks()->first()->name_mark}}
</tr>