我尝试在Laravel中定义自定义模型方法。我在Subscription
和Notification
之间的{:1}}之间存在n:m关系。
我已经定义了默认关系:
SubscriptionNotification
现在我想定义一个方法,它返回一组通知。我在数组中收集了我想要的通知的ID,并编写以下方法:
public function subscription_notifications() {
return $this->hasMany('App\SubscriptionNotification');
}
public function notifications() {
return $this->belongsToMany('App\Notification', 'subscription_notifications');
}
但是当我想使用public function notifications_due() {
// Collect $notification_ids
return $this->belongsToMany('App\Notification', 'subscription_notifications')->whereIn('notifications.id', $notification_ids)->get();
}
的方法时,我收到以下错误:
$subscription->notifications_due
我是Laravel的新手(我来自Rails)。我不知道这是否在Laravel中是否可能。也许有人可以帮助我。谢谢!
答案 0 :(得分:2)
从关系方法中移除get
来电,例如:
public function notifications_due() {
return $this->belongsToMany(
'App\Notification',
'subscription_notifications
')->whereIn('notifications.id', $notification_ids);
}
使用它:
// It'll return a collection
$dues = $subscription->notifications_due;
要从集合中获取所有id
,您可以尝试这样做:
$ids = $dues->pluck('id');
此外,如果您想要使用它,可以添加更多约束:
$dues = $subscription->notifications_due()->where('some', 'thing')->get();
或分页:
$dues = $subscription->notifications_due()->where('some', 'thing')->paginate(10);
答案 1 :(得分:1)
删除方法->get()
中的notifications_due
部分。 get()
将返回一个Collection,但是当将该方法作为属性(或魔术方法)调用时,Laravel希望该方法返回Relation
的实例。然后,Laravel将执行查询并自动将其转换为Collection。
此外,您可以使用已定义的notifications()
方法:
public function notifications_due() {
// Collect $notification_ids
return $this->notifications()->whereIn('id', $notification_ids);
}