laravel 为什么Eloquent with()不执行连接?

yfjy0ee7  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(167)

我尝试在Laravel Eloquent中建立一对多的关系,问题是我不能把一个问题和它的protectionclass放在一起,例如Question::with(protectionclass)->get(); This只返回问题。我有问题,也有对应的protectionclass。一个问题Map到一个protectionclass,一个protectionclass可以有很多问题。代码也存储在git中,带有一个db seeder:我使用的是Laravel 10.1.5,带有Jetstream,vuejs,tailwindcss和Inertia。但是问题出在Laravel内部。
这两个模型是:

class ProtectionClass extends Model
{
    use HasFactory;

    protected $table = 'protectionclasses';

    protected $attributes = [
        'name' => '',
    ];

    protected $fillable = [
        'name',
    ];

    public function questions(){
        return $this->hasMany(Question::class, 'protectionclass_id');
    }

}

以及

class Question extends Model
{
    use HasFactory;

    protected $fillable = [
            'protectionclass_id',
            'question',
            'weight',
    ];

    protected $attributes = [
        'protectionclass_id' => 1,
    ];


    public function protectionclass(){
        return $this->belongsTo(ProtectionClass::class, 'protectionclass_id');
    }
}

迁移包括:

public function up()
    {
        Schema::create('protectionclasses', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

以及

public function up()
    {
        Schema::create('questions', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('protectionclass_id');

            $table->string('question');
            $table->integer('weight')->default(1);
            $table->foreign('protectionclass_id')->references('id')->on('protectionclasses');
            $table->timestamps();
        });
    }

这是工作正常,但返回的保护类只:Question::find(1)->protectionclass;
有人知道吗?我已经挣扎了好几个小时了...非常感谢!
向你问好,约翰尼斯
当我调用$questions = Question::with('protectionclass')->get();时,我会得到所有的问题,但没有相应的protectionclass。我希望有它与protectionclass。

wydwbb8l

wydwbb8l1#

with()方法以急切加载格式提供信息,也就是说,它已经在对象示例中预加载了关系。
此预加载存储在通过模型对关系的访问中:$question->protectionclass,它将给予您访问其父项的权限。$protectionclass->questions的相反大小写将授予您访问它所拥有的项集合的权限。
我希望它能被保护。
您已经可以访问protectionClass数据,因此$question->protectionclass->name;
如果关系实际上存在于已填充的数据库中,并且在调用关系时没有返回任何内容,请检查模型中关系函数中的键:

//Laravel doc exemples
$this->belongsTo(Post::class, 'foreign_key', 'owner_key');
$this->hasMany(Comment::class, 'foreign_key', 'local_key');

相关问题