gpt4 book ai didi

php - 为什么我在 Laravel 中的简单属于关系不起作用?

转载 作者:行者123 更新时间:2023-12-03 21:42:50 26 4
gpt4 key购买 nike

我有一个用户迁移如下:

Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
和一个 BlogPosts 迁移如下:
 Schema::create('blog_posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title')->unique();
$table->string('image');
$table->text('text');
$table->timestamps();
});
他们每个人都有一个模型(博客帖子和用户)
在 BlogPost 模型上,我有以下内容:
public function getUser(){
return $this->belongsTo(User::class);
}
我向数据库添加了一些测试数据,如下所示:
用户表:

ID: 1, email: test@test.com, password: hashed


blog_post 表:

ID: 1, title: title, image: /image.jpg, text: some text, user_id: 1


现在在修补匠中,我执行以下操作:
$var = \App\Models\BlogPost::find(1);
$var->getUser(); //Outputs: null
如果我将 getUser 修改为:
public function getUser(){
return $this->belongsTo(User::class)->toSql();
}
tinker 的输出是:

select * from users where users.id is null


我在这里做错了什么?,我错过了什么吗?

最佳答案

澄清一下,当您调用与 () 的关系时,你有一个 Builder 的实例类,它允许您链接方法以执行其他查询逻辑。例如:

$var = BlogPost::find(1);
$var->getUser();
如果您在 php artisan tinker 中运行此代码,输出不应该是 null ,而是 Illuminate\Database\Eloquent\Relations\BelongsTo 的一个实例.预计您会通过 closure到您的查询以实际执行它:
$var = BlogPost::find(1);
$var->getUser()->first();
这应该输出 App\Models\User 的实例,或者,如果没有关联的记录, null .
关系也提供了快速访问属性,允许您简单地执行以下操作:
$var = BlogPost::find(1);
$var->getUser;
当您省略 () 时,合适的 closure在幕后自动应用。在 belongsTo() 的情况下, ->first()被申请;被应用。
最后,建议以关联的模型命名您的关系。在这种情况下:
public function user() {
return $this->belongsTo(User::class);
}
出于几个原因。一、 public function getUser()建议通过 getter 方法调用(就像你正在做的那样,通过 ->getUser() ),但由于这可以作为属性调用(通过 ->getUser ),它是不明确的。其次,使用与模型相同的名称自动应用外键。相比:
public function getUser() {
return $this->belongsTo(User::class, 'user_id');
}

public function user() {
return $this->belongsTo(User::class);
}
如果您使用 getUser() ,您需要通过 user_id作为外键(感谢 r89human 捕捉到这个 https://stackoverflow.com/a/66441903/3965631 )。如果您使用 user() ,然后它会自动确定。

关于php - 为什么我在 Laravel 中的简单属于关系不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66441297/

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