仅当枢轴属性为空时才通过 manyToMany 计算相关模型 - Laravel

Posted

技术标签:

【中文标题】仅当枢轴属性为空时才通过 manyToMany 计算相关模型 - Laravel【英文标题】:Counting Models related through manyToMany only if a pivot attribute null - Laravel 【发布时间】:2016-08-19 18:14:27 【问题描述】:

我正在详细说明这里获得的代码 ManyToMany relation - how update attribute in pivot table

我想要什么:

我想收集与任何每周Routine 相关的Activities 集合。数据透视表的属性 done_at 告诉我任何活动(任务)何时完成。

我可以在多对多关系中列出与父模型相关的->count() 活动:

public function activities()


    return $this->belongsToMany('App\Models\Activity', 'activity_routine', 'routine_id', 'activity_id')->withPivot('done_at')->withTimestamps();

现在我想要收集尚未完成的活动。他们有一个枢轴属性done_at 设置为null

我的尝试:

我希望下面的代码能正常工作。不幸的是,它没有。 我收到错误Illegal operator。当我把'!=' 替换为'=' 时,代码就像做梦一样工作,但它给了我已经完成的活动列表。

有什么提示吗?

public function activitiesOnlyDone()


    return $this->belongsToMany('App\Models\Activity')->withPivot('done_at')->wherePivot('done_at','!=',null);


其他提示: getting the value of an extra pivot table column laravel

【问题讨论】:

【参考方案1】:

我相信在这种情况下,你可以替换

->wherePivot('done_at','!=',null);

用一个简单的

->whereNull('done_at');

如果其他表上有done_at 列,您将不得不这样做

->whereNull('activity_routine.done_at');

这是因为 Relation 类使用 Laravel 的查询构建器来构建最终的数据库查询。并且任何未在 Relation 类中定义的关系上调用的方法都将通过 __call() 方法传递给查询构建器(Illuminate\Database\Query\Builder)。

【讨论】:

令我惊讶的是它确实有效。谢谢你。我还向 Laravel/Framework 提交了错误报告,因为 Illegal operator 错误是需要修复的。谢谢!

以上是关于仅当枢轴属性为空时才通过 manyToMany 计算相关模型 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章

仅当集合为空时才弹出值的直觉

MSSQL - 仅当所有值都不为空时才插入值

SwiftUI:仅当输入不为空时才启用保存按钮

JPA:仅当结果集不为空时才缓存查询

MongoDb 仅当数组不为空时才在数组中添加字段

仅当字段为空时才更新来自 select 语句的查询