Laravel从多个消息中获取用户

时间:2018-07-02 15:58:21

标签: laravel

我有 username = request.POST.get('username') username = username.lower() password = request.POST.get('password') user = authenticate(username=username, password=password) if user is not None: login(request, user) if user.is_staff: return redirect('sweet:vendor_index') else: return redirect('sweet:index') 的{​​{1}}桌子

offers表,其中包含列idMessages

offer_id表与from

我想让用户从Users中的商品id开始 我的目标是吸引至少回复了一条消息的用户。

我开始使用功能消息配置$this模型以获取消息

OfferResource

所以我能够收到所有消息(从商品资源开始):

Offer

我现在应该如何配置消息模型以获取所有用户而不是消息?

我试图用public function messages(){ return $this -> hasMany('App\Message'); } 模型来编写:

'users' => $this->messages

然后:

Message

但是我遇到了错误:public function fromContact() { return $this->hasOne(User::class, 'id', 'from'); }

我应该如何更正我的代码以使其正常工作?

3 个答案:

答案 0 :(得分:1)

在Message模型中,您必须精化引用用户的列:

public function fromContact()
{
    return $this->hasOne(User::class, 'from');
}

然后在获取消息后,将它们循环遍历以使用户像这样:

foreach ($this->messages as $message) {
    $user = $message->fromContact;
    // do somthing with the user :)
}

答案 1 :(得分:1)

您的消息表的from字段引用了User模型,而offer_id字段引用了Offer模型,这意味着您在OfferUser

优惠模式

public function users(){
    return $this->belongsToMany(User::class, 'messages', 'offer_id', 'from')->using('App\Message');
}

消息透视

class Message extends Pivot {
     protected $table = 'messages';
}

用户模型

public function offers(){
    return $this->belongsToMany(Offer::class, 'messages', 'from', 'offer_id')->using('App\Message');
}

优惠资源

public function toArray($request)
{
    $users = $this->users; 

    return [
        'id' => $this->id,
        ... //add your offer fields here
        'users' => $users->toArray(), // here $users is a laravel Collection
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ];
}

从控制器或路由访问

Route::get('/offer', function () {
    return new OfferResource(Offer::with('users')->find(1)); //eager load users
});

答案 2 :(得分:1)

我假设from表上的Messages字段是使用用户ID填充的。然后,您可以在belongsToManyOffer模型之间建立User关系。由于这实际上是与数据透视表messages的多对多关系。

Offer模型中定义

public function users()
{
    return $this->belongsToMany('App\User', 'messages', 'offer_id', 'from');
}

然后从OfferResource中像这样加载offers数据—

$offers = App\Offer::with('users')->get();

然后像这样循环遍历$offers

foreach ($offers as $offer) {
    dd($offer->users); // one offer will have multiple users as a Collection
}

类似地,对于ID为$offer的{​​{1}},您可以这样做

1

然后使用$offer = App\Offer::with('users')->find(1)

即可获得对此优惠发表评论的users

有关定义多对多关系的信息,请参见official documentation