hasManyThrough可容纳3张桌子

时间:2019-03-02 23:28:21

标签: php laravel

我对方法 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...

感谢您的帮助。

下面的概述屏幕截图 enter image description here enter image description here

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。

enter image description here

1 个答案:

答案 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>