Laravel多态关系有很多通过

时间:2017-04-07 19:29:29

标签: php laravel relationship has-many-through

我有一个订阅者模型

// Subscriber Model

id
user_id
subscribable_id
subscribable_type

public function user()
{
    return $this->belongsTo('App\User');
}

public function subscribable()
{
    return $this->morphTo();
}

主题模型

// Topic Model

public function subscribers()
{
    return $this->morphMany('App\Subscriber', 'subscribable');
}

我想让所有用户通过订阅者模型,通知他们

通知::发送($ topic->用户,新通知($ topic));

// Topic Model


public function users()
{
    return $this->hasManyThrough('App\User', 'App\Subscriber');
}

有什么想法吗?

5 个答案:

答案 0 :(得分:10)

// Topic Model

public function users()
{
    return $this->hasManyThrough('App\User', 'App\Subscriber', 'subscribable_id')->where('subscribable_type', array_search(static::class, Relation::morphMap()) ?: static::class);
}

多态hasManyThrough关系与其他关系相同,但在subscribable_type上有一个附加约束,可以从Relation::morphMap()数组中检索,或者直接使用类名

答案 1 :(得分:3)

尝试此套餐 https://github.com/staudenmeir/eloquent-has-many-deep

然后您可以像这样使用它:

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        string input = TextInput.Text + " ";
        TextOutput.Text = input;
        string output = TextOutput.Text;

        for (int i = 0; i <50; i++)
        {
            output = output.Substring(1, output.Length - 1) + output[0];
            TextOutput.Text = output;
            await Task.Delay(150);
        }
    }

答案 2 :(得分:1)

除了Matt的方法外,以下代码也可能是另一种解决方案:

//Topic Model
public function users()
{
    return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
        ->where('subscribale_type', static::class);
}

通过这种方式,Subscriber被视为数据透视表,第二个参数是数据透视表的名称。

  

第三个参数是您要在其上定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称。了解更多here

请考虑where之后的belongsToMany子句,以仅过滤当前模型。

答案 3 :(得分:0)

您追求的不是hasManyThrough,而是morphedByMany

hasManyThrough在您拥有A一对多BB一对多C且要使用时非常有用A来获取许多C

您拥有的是位于AC之间的多态枢轴表。

// Topic Model

public function users()
{
    return $this->morphedByMany('App\User', 'subscribable', 'pivot/subscriber_table_name');
}

文档:https://laravel.com/docs/6.x/eloquent-relationships#many-to-many-polymorphic-relations

答案 4 :(得分:-1)

好的,我有一个更好的解决方案

// Subscriber Model

use Notifiable;

public function receivesBroadcastNotificationsOn()
{
    return 'App.User.' . $this->user_id;
}


// Send Notification

Notification::send($post->subscribers, new TestNotification($post));