Laravel: 如何用外键填充现有数据?

Laravel: How to populate existing data with a foreignkey?

我在我的 mysql 数据库中构建了两个模型,代表两个 table。 在一个 table 中,我得到了一些汽车经销商的邮政编码,在第二个中,我得到了坐标 的邮政编码。 不幸的是,我没有得到 相关数据。 我用了 zip_code 和 foreign_key。

public function up()
{
    Schema::create('plzs', function (Blueprint $table) {
        $table->id();
        $table->text("Ort");
        $table->decimal('Latitude', 10, 8);
        $table->decimal('Longitude', 11, 8);
    });
}

public function up()
{
    Schema::create('autodealers', function (Blueprint $table) {
        $table->id();
        $table->bigInteger('plz_id')->unsigned();
        $table->text("Händler");

        $table->foreign('plz_id')->references('id')->on('plzs')->onDelete('cascade');          
    });
}

然后我迁移 table 并在我的数据库中创建 table。 之后,我通过 csv 文件将数据导入 mySQL 中的 tables。一切正常。

这里我定义的是一对一的关系。 plz.php:

public function dealer()
{
    return $this->hasOne('App\Autodealer', 'plz_id');
}

Autodealer.php:

public function coor()
{
    return $this->belongsTo('App\plz');
}

通过web.php 我正在定义路线:

Route::get('/auto', 'AutohaendlerController@index');

从这条路线我调用索引方法:

public function index()
{
    $dealer = \App\Autodealer::all();
    return view('plz', array('ausgabe'=>$dealer));
}

当我的视图看起来像这样时,它工作得很好:

<body>

    <ul>
        @foreach ($ausgabe as $dealer)
            <li>{{$dealer}}</li>
        @endforeach
    </ul>

但是当我改用<li>{{$dealer->coor}}</li>时,没有显示任何数据。 coor() 函数应该调用 belongTo 方法。 在修补程序中,我的数据似乎也不相关。

我错过了什么?

当我使用 tinker 并保存具有相同 ID 和 plz_id 的 plz 对象和 Autodealer 对象时,它起作用了。 当我导入数据时,这似乎是一个问题。

我认为您缺少 coor() 关系中的键。您没有在 autodealers table 中使用 id 作为外键,因此您需要在关系中设置它。

public function coor()
{
    return $this->belongsTo('App\plz', 'id', 'plz_id');
}

当我使用 Tinker 时,我注意到,如果没有 updated_atcreated_at,我将无法保存对象。 Tinker 抛出这个 SQL-Error:

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list' (SQL: insert into plzsidupdated_atcreated_at)值(33611、2020-07-02 11:18:12、2020-07-02 11:18:12) )'

所以我在我的表中添加了时间戳:

public function up()
{
    Schema::create('plzs', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->text("Ort");
        $table->decimal('Latitude', 10, 8);
        $table->decimal('Longitude', 11, 8);
        $table->timestamps();
    });
}

public function up()
{
    Schema::create('autodealers', function (Blueprint $table) {
        $table->bigIncrements('id');
        //connect to the plzs table via reference to plz table
        $table->unsignedBigInteger('plz_id');
        $table->text("Händler");

        //index for any foreign key
        $table->index('plz_id');  
        $table->timestamps();
    });
}

在mySQL中,updated_atcreated_at列中的每个table必须另外设置CURRENT-TIME标准,以便填写updated_atcreated_at 导入 csv 数据期间的列。

此致