我有以下User::class条:

class User extends Authenticatable
{
    /* ........ */

    protected $with = ['subscription', 'photo'];

    public function subscription(): HasOne
    {
        return $this->hasOne(Subscriptions::class, 'id', 'subscription_id');
    }
    
 
    public function photo(): HasOne
    {
        return $this->hasOne(Files::class, 'id', 'photo_file_id');
    }
}

通过使用$with,在查询User::class时总是加载关系subscriptionphoto.

然而,有时我想避免这种关系.The documentation表示:

如果要覆盖$WITH属性中的所有项 对于单个查询,可以使用with Only方法:

因此,考虑到这一点,我执行了以下查询:

$notifications = \App\Models\Notifications::withOnly('fromuser')
    ->where('to_user_id', auth()->user()->id)
    ->limit(15)
    ->orderBy('id', 'DESC')
    ->get();

然而,Laravel Debug Bar显示同时加载了subscriptionphoto个关系.另外,如果我输出$notifications->toArray(),那么关系也会显示出来.

Notifications::class个字相当直白:

class Notifications extends Model
{
    /* ..... */
    
    public function fromuser(): HasOne
    {
        return $this->hasOne(User::class, 'id', 'from_user_id');
    }

    public function touser(): HasOne
    {
        return $this->hasOne(User::class, 'id', 'to_user_id');
    }
}

我错过了什么吗?


Edit:我知道我可以做到:

\App\Models\Notifications::with(['fromuser' => function($query)
{
    $query->without(['subscription', 'photo']);
}])

但我希望避免这种情况,因为:

  1. 我打User::class是几百个地方
  2. 我以后可能会添加更多的关系

如果不可能只做->withOnly,我可能会忘记使用$with属性.

推荐答案

我认为你没有太多的 Select : 您可以在通知内创建作用域


class Notifications extends Model
{

    public function scopeWithUser($query, $relations = [])
    {
        return $query->with(['fromuser' => fn($query) => 
            empty($relations)
                ? $query->setEagerLoads([])
                : $query->withOnly($relations)
        ]);
    }
}

然后:

Notifications::withUser()->get()

或者,如果您与热切的人有其他关系:

Notifications::withUser()->with('relation1')->get()

因此,如何组织和修改代码以满足您的需求取决于您

Update:

如果我还记得的话,$with总是依赖于模型列,所以如果您不为示例subscription_idphoto_file_id Select ,关系将不会被自动加载!

你能试一试吗?

Notifications::with('fromuser:id,name,email')->get()

Php相关问答推荐

条纹 checkout :订阅试用版和额外付款(add_invoice_items)错误

Symfony Monolog:使用多个格式化程序

在保留唯一键值对的情况下高效合并嵌套数组

自定义WooCommerce帐户下载列表

在WooCommerce产品中按类型对产品属性术语进行分类以供显示

在没有symfony应用程序的情况下使用安全Bundle 包时,缺少配置构建器类

通过访问单个产品页面更新WooCommerce产品元数据

PHP MySQL求和子树并与父树累加

删除了数组中的值,而不是多个数组

如何从该字符串中删除这些图标转换的ASCII问号字符?

在WordPress中从CPT中删除插件

如何配置我的.env文件以在laravel的一个项目中连接两个不同的数据库?

在PHP项目中安装OpenAI PHP SDK时出现问题

强制客户在注册时 Select WooCommerce角色

将一个表中的行连接为不同表MYSQL中的一列

由于 PHP 版本不受支持,如何终止 PHP 脚本?

PHP 中是否有 is_closure() 函数?

无法在 Laravel 10 中安装 jenssegers/mongodb

获取具有所有特定相关模型的模型

来自命令行的 PHP 没有给出正确的结果