【问题标题】:Laravel Lazy Loading Reference $this->property in Load() custom constrainLaravel 延迟加载参考 $this->property in Load() 自定义约束
【发布时间】:2016-11-08 20:33:40
【问题描述】:

我在一个模型上有一个关系,我需要在我的控制器上延迟加载,但我需要使用原始模型中的属性进行查询约束。 所以我有类似的东西:

$Users = User::all();
$Users->load(['disputes' => function($query){
 $query->where('property', $this->property );
}]);

但它返回未定义的属性 $account_number_tu。 执行 load() 时,如何确保 $this 引用 $Users 中的每个 $User? 我尝试在模型中执行此约束,但

$this->property;

返回空值。

【问题讨论】:

    标签: orm eloquent laravel-5.2 constraints


    【解决方案1】:

    在后台,load()User 模型上初始化 Builder 的一个实例,然后将您传递给 load 的参数传递给构建器上的 with 方法。有了这个,您可以在 load 方法中执行您在 with 方法中可以执行的所有操作。

    要回答您的问题,您可以这样做:

    $Users = User::all();
    $Users->load(['disputes' => function($query) {
        return $query->select('disputes.*')
            ->leftJoin('disputes', 'disputes.user_id', '=', 'users.id')
            ->whereRaw('users.property = disputes.property');
    }]);
    

    与以下内容相同:

    $Users = User::with(['disputes' => function($query) {
        return $query->select('disputes.*')
            ->leftJoin('disputes', 'disputes.user_id', '=', 'users.id')
            ->whereRaw('users.property = disputes.property');
    }]);
    

    【讨论】:

    • 所以争议是另一个表,例如,如果用户有一个名为电话的属性,我可以这样做 whereRaw('disputes.phone' = users.phone'); ?
    • 正确。在usersdisputes 是表名的情况下(如果不是,则将它们与带有前缀的实际表名交换)。
    • 我实际尝试查询的表的名称是“disputes”和“score_aware_disputes_accounts”。这些是 MySQL 中显示的名称,但我不断收到错误 Column not found。我正在查询 whereRaw('disputes.account_id = score_aware_disputes_accounts.id');
    • 它指定它找不到列'score_aware_disputes_accounts.id'。它就像它不尝试在指定的表中查找一样。
    • User 上的disputes 关系定义为什么?即:$this->hasMany(Dispute::class);该关系的关键列名称是什么?
    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2015-03-27
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多