我有 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
表,其中包含列id
和Messages
和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');
}
我应该如何更正我的代码以使其正常工作?
答案 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
模型,这意味着您在Offer
与User
。
优惠模式
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填充的。然后,您可以在belongsToMany
和Offer
模型之间建立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。