我有一个订阅者模型
// 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');
}
有什么想法吗?
答案 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
一对多B
,B
一对多C
且要使用时非常有用A
来获取许多C
。
您拥有的是位于A
和C
之间的多态枢轴表。
// 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));