php - hasManyThrough 3 个表
问题描述
我对HasManyThrough方法感到困惑。在我的视图/cars/index.php 中,我想获取 id、matriculation、name (fk_serie)、name_mark。我有一条错误消息“SQLSTATE[42S22]: Column not found: 1054 Champ 'marks.fk_serie' inconnu dans on clause”?
我实际上有 3 个表:第一个名为汽车,我有 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
{
//
}
第三个问题:您认为我的循环可以吗?
在我看来/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...
谢谢您的帮助。
汽车控制器
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。
解决方案
Car和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 方法的第一个参数是我们希望访问的最终模型的名称,而第二个参数是中间模型的名称。
执行关系查询时将使用典型的 Eloquent 外键约定。如果您想自定义关系的键,可以将它们作为第三个和第四个参数传递给 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
,如果您想要属于汽车的标记名称,只需执行以下操作:
在你看来
<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>
推荐阅读
- java - Java resilience4j Retry policy goes infinite after 2 retries
- php - 检查 PayPal 付款是否已完成
- powershell - 为什么命令行执行会给PowerShell中的脚本执行不同的结果
- spring-boot - 从 url 下载 zip,计算 zip 文件中的文件数并将下载成功和文件计数字符串发送到响应正文
- hibernate - Hibernate Envers 新旧值
- c# - 使用 .NET Standard 2.0 生成 PDF 文档
- python - 有没有办法解析这个 html 表单?
- tensorflow - 成功构建图形张量流工具后符号查找错误
- docker - 如何强制 docker compose 重新创建手动删除的卷?
- python - 如何创建一个接受用户输入的子程序?