【问题标题】:Trying to restrict an Eloquent query to a relationship with a count of 0试图将 Eloquent 查询限制为计数为 0 的关系
【发布时间】:2014-02-22 23:10:19
【问题描述】:

我有两个模型(组织和交互),我想查询所有没有交互的组织的组织模型。组织与交互是一对多的关系。

我尝试查看原始 SQL 中的反连接,但无济于事。我还想完全避免像获取所有完整的组织,然后遍历它们以检查它们是否有任何交互,因为考虑到我正在处理的数据量,这是完全不切实际的。

为了澄清,我想避免这样:

$organizations = Organization::all();
foreach ($organizations as $org)
    if($org->interactions()->count() == 0){
        //Add the org to an array for later use because it has no interactions
    }

我正在使用 Laravel 3.x,我无法升级,因为项目非常大,而且我现在没有一个月的时间升级到 4.1。如果有更好的方法来完成类似 4 的操作,那么销售转换过程会更容易。

以下是一些相关代码:

//From organization.php
public function interactions() {
     return $this->has_many('Interaction');
}


//From interaction.php
public function organization() {
     return $this->belongs_to('Organization');
}

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    // 选择所有至少有 1 次交互的组织 ID

    $uniqueOrganizationIDs = DB::raw('SELECT organization_id FROM interactions GROUP BY(organization_id)');
    

    // 选择不在上述列表中的组织。

    Organization::whereNotIn('id', $uniqueOrganizationIDs)->get();
    

    【讨论】:

    • 这听起来是最有效的方法(不确定 whereNotIn 是否在 Laravel 3 中)。只有两个像我这样的查询,但不需要遍历数组。
    • 谢谢。 WhereNotIn 正是我想要的。在 L3 中是 where_not_in,但参数是一样的。
    【解决方案2】:

    这是我想出的解决方案:

    1. 使用list() 查询组织和交互模型。对于 Orgs,获取他们的 ID。对于交互,获取他们的组织 ID。我认为这是两个占用空间小、速度快的查询。

    2. 对他们执行array_diff() 以获得一组没有交互的组织。

    3. 使用where_in() 查询组织,为其提供差异数组。

    看起来像这样:

     $organizationIDs = DB::table('organizations')->where('is_deleted', '=', 0)->lists('id');
    
     $interactionIDs = DB::table('interactions')where('is_deleted', '=', 0)->lists('organization_id');
    
     $uncontactedOrganizationIDs = array_diff($organizationIDs, $interactionIDs);
    
     $uncontactedOrganizations = Organization::where_in('id', $uncontactedOrganizationIDs)->order_by('created_at', 'DESC')->get();
    

    有没有更好的方法来做到这一点?我觉得必须有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2013-11-30
      • 2017-11-25
      • 2021-06-10
      • 2013-10-03
      • 2017-07-19
      相关资源
      最近更新 更多