首页 > 解决方案 > 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。

在此处输入图像描述

标签: phplaravel

解决方案


CarMark之间的关系是错误的,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>

推荐阅读