Laravel 模型关系错误如何解决?

Posted

技术标签:

【中文标题】Laravel 模型关系错误如何解决?【英文标题】:Laravel Model relation error how to fix it? 【发布时间】:2022-01-14 05:15:39 【问题描述】:

我有两个模型:Barang 和 Ruangan

在迁移巴朗:

    <?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBarangTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('barang', function (Blueprint $table) 
            $table->id();
            $table->string('nama');
            $table->string('spesifikasi');
            $table->foreignId('id_ruangan');
            $table->string('kondisi');
            $table->integer('jumlah');
            $table->string('sumber_dana');
            $table->string('jenis');
            $table->string('keterangan');
            $table->timestamps();
        );
        
        Schema::table('barang', function (Blueprint $table) 
            $table->foreign('id_ruangan')->references('id')->on('ruangan');
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('barang');
    

在迁徙时软干

    <?php use Illuminate\Database\Migrations\Migration; 
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRuangansTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('ruangan', function (Blueprint $table) 
            $table->id();
            $table->string('nama_ruangan');
            $table->timestamps();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('ruangans');
    

这是我的模特巴朗

 <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Barang extends Model

    use HasFactory;
    
    protected $table = "barang" ;

    public function ruangan()
    
        return $this->belongsTo(Ruangan::class);
    

当我在 tinker 上调用它时

$bar = new Barang
$bar = Barang::first()
$bar->ruangan->nama_ruangan 

它返回 null ,

即使在数据库的每个表中我都添加了一些虚拟数据

我花了 3 个小时来解决它并没有找到答案,我已经回滚了迁移,我创建了两次仍然没有解决请帮助我

【问题讨论】:

【参考方案1】:

由于您在 laravel 的 naming convention 之外使用外键,因此您必须将自定义外键名称作为关系定义的第二个参数传递。

public function ruangan()

    return $this->belongsTo(Ruangan::class, 'id_ruangan');

然后你可以访问$bar-&gt;ruangan-&gt;nama_ruangan;从软干模型中获取nama_ruangan

【讨论】:

非常感谢 NoobDev 和 zahid hasan emon 的答案必须结合起来,最后在我在模型中添加关系并使用 return $this->belongsTo(Room: :class, 'id_room');最后我可以调用 $bar->room 并返回值 App\Models\Room #3648 ids: 1, room_name: "Administrative room", created_at: "2021-12-09 17:24:25", updated_at: "2021 -12-09 17:24:25", 这个问题如何接受两个答案? 不强制使用hasMany关系访问$bar-&gt;ruangan-&gt;nama_ruangan 非常感谢您对我的帮助,我会记住您的帮助我非常感谢您所做的。之前很抱歉,因为看到您的声誉已经很好所以我将选择NoobDev的答案,以便他也可以像你们一样成长,但实际上你们两个做到了,我真的很感激, 您必须实际选择正确的答案,以便它可以帮助未来的用户。【参考方案2】:

你把关系放在软干模型上了吗?

例子:

  public function barang()
    
        return $this->hasOne(Barang::class);
    

顺便说一句,首先返回集合中的第一项

【讨论】:

我刚刚添加,我改变了与 hasMany() 的关系,我一直得到空值 非常感谢 NoobDev 和 zahid hasan emon 的答案必须结合起来,最后在我在模型中添加关系并使用 return $this->belongsTo(Room: :class, 'id_room');最后我可以调用 $bar->room 并返回值 App\Models\Room #3648 ids: 1, room_name: "Administrative room", created_at: "2021-12-09 17:24:25", updated_at: "2021 -12-09 17:24:25",

以上是关于Laravel 模型关系错误如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:当我的外键在数组中时,如何在模型中添加关系?

数据透视表的laravel关系问题

通过 laravel 中的关系进行咨询

Laravel 为关系指定外键

如何解决 Laravel sslcommerze 集成错误?

如何解决 laravel 迁移错误“一般错误:1005 无法创建表”