在Laravel中获取关系的自定义模型方法

时间:2016-03-22 13:58:33

标签: php laravel laravel-5

我尝试在Laravel中定义自定义模型方法。我在SubscriptionNotification之间的{: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中是否可能。也许有人可以帮助我。谢谢!

2 个答案:

答案 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);
}