gpt4 book ai didi

php - 两列中同一表中 Eloquent 多个外键

转载 作者:行者123 更新时间:2023-11-29 04:16:54 24 4
gpt4 key购买 nike

我在从我的时刻表中调用离开 ICAO 和到达 ICAO 时遇到问题。 Laravel 一直给我错误,说我的关系搞砸了。这是代码。

Schema::create('airports', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('city');
$table->string('country');
$table->string('iata');
$table->string('icao');
$table->double('lat');
$table->double('lon');
$table->longText('data')->nullable(); //JSON Data for All gate information for the system.
$table->softDeletes();
});
Schema::create('schedule_templates', function (Blueprint $table) {
$table->increments('id');
$table->string('code');
$table->string('flightnum');
$table->integer('depicao')->unsigned();
$table->foreign('depicao')->references('id')->on('airports')->onDelete('cascade');
$table->integer('arricao')->unsigned();
$table->foreign('arricao')->references('id')->on('airports')->onDelete('cascade');
$table->string('aircraft')->nullable();
$table->boolean('seasonal');
$table->date('startdate');
$table->date('enddate');
$table->time('deptime');
$table->time('arrtime');
$table->integer('type');
$table->boolean('enabled');
$table->text('defaults');
$table->timestamps();
$table->softDeletes();
});

这是模型

class ScheduleTemplate extends Model
{
public $table = "schedule_templates";

public function depicao()
{
return $this->hasOne('App\Models\Airport', 'depicao');
}
public function arricao()
{
return $this->hasOne('App\Models\Airport', 'arricao');
}
}

class Airport extends Model
{
//
public $timestamps = false;

public function schedules()
{
return $this->belongsToMany('App\ScheduleTemplate');
}
}

当我尝试使用以下代码进行查询时,出现错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'vaos_airports.depicao' in 'where clause' (SQL: select * from vaos_airports where vaos_airports.depicao in (1))

$schedules = ScheduleTemplate::with('depicao')->with('arricao')->get();

最终目标是将结果拉入表格。如果有兴趣,这是该代码。

@foreach($schedules as $s)
<tr>
<td>{{$s->code}}</td>
<td>{{$s->flightnum}}</td>
<td>{{$s->depicao()->name}}</td>
<td>{{$s->arricao()->name}}</td>
<td>{{$s->aircraft}}</td>
<td>{{$s->seasonal}}</td>
<td>{{$s->type}}</td>
</tr>
@endforeach

编辑:

我解决了关系问题显然我把它们调换了。这是更新的模型类

class ScheduleTemplate extends Model
{
public $table = "schedule_templates";

public function depicao()
{
return $this->belongsTo('App\Models\Airport', 'depicao');
}
public function arricao()
{
return $this->belongsTo('App\Models\Airport', 'arricao');
}
}

class Airport extends Model
{
//
public $timestamps = false;

public function schedules()
{
return $this->hasMany('App\ScheduleTemplate');
}
}

现在错误出在 View 文件中。我要么得到 BelongsTo 错误:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

如果我有没有“()”的 arricao 或 depicao,或者这个

Trying to get property of non-object

最佳答案

关键是,关系的第二个参数应该是外键,第二个是本地键。

来自文档:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

所以在你的情况下,试试这个:

public function depicao()
{
return $this->hasOne('App\Models\Airport', 'id', 'depicao');
}
public function arricao()
{
return $this->hasOne('App\Models\Airport', 'id', 'arricao');
}

更新抛出错误是因为此关系具有相同的列名。在我看来,有两种解决方案:

  1. 尝试从关系中取出第一个对象,就像这样。 但这里要注意:预加载是行不通的!

    <td>{{$s->depicao()->first()->name}}</td>
    <td>{{$s->arricao()->first()->name}}</td>

  2. 重命名您的关系或列,以免它们与当前列名称重叠。这是迄今为止最好的选择。

例如,您可以将列更改为depeciao_idarricao_id,这也表示这些列引用了具有相应ID 的另一个表,更具描述性。

关于php - 两列中同一表中 Eloquent 多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com