我的设置:
我有2个模型:User
和Setting
。
用户可以有许多设置:
public function settings(): HasMany
{
return $this->hasMany(Setting::class);
}
$user = User::with('settings')->find($id);
以下是迁移:
Schema::create('settings', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('user_id')->nullable()->index();
$table->text('description');
$table->string('setting_key');
//$table->json('setting_value')->nullable();
$table->text('setting_value')->nullable();
$table->timestamps();
});
user_id
列可以为空,因为settings
表具有默认设置。
我的问题:
我想让settings()
关系也返回user_id
为空的行(这些是默认设置,没有链接到特定用户)。
到目前为止我尝试的内容:
这并不奏效:
public function settings(): HasMany
{
return $this->hasMany(Setting::class)->orWhereNull('settings.user_id');
}
这也不起作用,即使我的调试栏中的SQL请求似乎很好:
$user = User::query()
->with([
'settings' => function (HasMany $query) {
$query->orWhereNull('settings.user_id');
},
// irrelevant stuff
])
->findOrFail($userId);
其运行:
select * from `settings` where `settings`.`user_id` in ('123') or `settings`.`user_id` is null
无论如何,$user->settings
是一个Collection,它不包含settings
表中user_id
为null的任何行。它只包含user_id
等于用户id的行。
2条答案
按热度按时间bnl4lu3b1#
合并两个结果或原始表达式如何?
我实现了你所有的代码,我可以看到同样的困难...所以我发现这些解决方案不是很优雅,但功能。
备选1 -合并结果:
我在php artisan tinker上的输出
备选2 -原始表达式:
svmlkihl2#
这是一个真实的的“Laravel方式”解决方案,仍然允许你像往常一样使用关系。