仅在关系结果存在时获取对象[laravel]

时间:2017-07-27 15:34:21

标签: php laravel orm relation eager

仅当关系查询计数大于0时才出现获取数据的问题。

这是我的客户模式与关系

Supplied AttributeValue is empty, must contain exactly one of the supported datatypes

这是合约

的模型
class Customer extends Model
{
    protected $table = 'customers';

    public function contracts()
    {
        return $this->hasMany('App\Contract');
    }

最后,我只需要与他们签订合同的客户

class Contract extends Model
{
    public function customer()
    {
        return $this->belongsTo('App\Customer');
    }
}

但我有所有客户。它看起来像这样:

$customers = Customer::with(['contracts' => function($query)
     {
        $query->where('data_end','>=','2017-07-01')
              ->where('data_end','<=','2017-07-31') 
              ->where('typ','=','U') ;
     }
    ])->paginate(10);

在这个例子中,我不需要客户1,2和5.我怎么能用热切的加载和最终关系对象来做。

enter image description here

这种情况发生了,我不需要在屏幕截图上使用X的客户 - 我的意思是,我不需要客户从0那里查询合同

- 来自dd()的对象 -

此查询结束 2个客户,1个有2个合同,2个有0个合同

"Customer 1"
"Customer 2"
"Customer 3"
  *"Contract 1"
  *"Contract 2"
  *"Contract 3"
"Customer 4"
  *"Contract 1"
  *"Contract 2"
  *"Contract 3"  
"Customer 4"  

1 个答案:

答案 0 :(得分:0)

您的代码几乎就在那里。

你没有指定你正在使用哪个版本的Laravel,但是你应该看看whereHas(至少从5.0开始存在于Laravel中)

https://laravel.com/docs/5.0/eloquent#querying-relations(v5.0)

  

访问模型的记录时,您可能希望根据关系的存在来限制结果。例如,您希望提取至少包含一条评论的所有博文。为此,您可以使用has方法:

     

如果你需要更多的力量,你可以使用whereHas和orWhereHas方法来放置&#34;其中&#34;你的条件有疑问:

请尝试以下代码。

$customers = Customer::with('contracts')->whereHas('contracts', function($query)
 {
    $query->where('data_end','>=','2017-07-01')
          ->where('data_end','<=','2017-07-31') 
          ->where('typ','=','U') ;
 }
)->paginate(10);

这将向客户加载合同对象,但仅返回与查询匹配的合同的客户。