如何向枢轴模型添加关系?
我有以下表格:
users
-id
events
-id
user_event
-id
-user_id
-event_id
tickets
-price
-user_event_id
因此,一个用户可以访问许多事件,一个事件属于许多用户。现在我希望用户可以为一个特殊活动提供许多不同的门票。
我的模型如下:
class Event extends Eloquent{
// Joins
public function getUsers(){
return $this->belongsToMany('User', 'user_event', 'event_id', 'user_id')->withPivot('id', 'emailSent', 'info')->withTimestamps();
}
// Pivot
public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
if ($parent instanceof User) {
return new UserEvent($parent, $attributes, $table, $exists);
}
return parent::newPivot($parent, $attributes, $table, $exists);
}
class User extends Eloquent implements UserInterface, RemindableInterface {
//Joins
public function getEvents(){
return $this->belongsToMany('Event', 'user_event', 'user_id', 'event_id')->withPivot('id', 'emailSent', 'info')->withTimestamps();
}
// Pivot
public function newPivot(Eloquent $parent, array $attributes, $table, $exists) {
if ($parent instanceof Event) {
return new UserEvent($parent, $attributes, $table, $exists);
}
return parent::newPivot($parent, $attributes, $table, $exists);
}
use Illuminate\Database\Eloquent\Relations\Pivot;
class UserEvent extends Pivot{
protected $table = 'user_event';
public function tickets() {
return $this->hasMany('Ticket');
}
}
class Ticket extends Eloquent{
// Joins
public function getUserEvent(){
return $this->belongsTo('user_event','user_event_id');
}
现在我想列出一个特定用户的第一张票给一个特定事件: 我尝试了以下方法:
$event->first()->getUsers->first()->pivot->tickets->first();
但是我收到一条错误消息:
Call to a member function first() on a non-object
我不知道应该在哪里解决这个问题。我已经看过了
https://github.com/laravel/framework/issues/2093#issuecomment-39154456
Using pivot model data as a relationship to another model in Laravel 4's Eloquent
但它并没有解决我的问题。
有什么想法吗?或者Eloquent不可能这样做吗?
答案 0 :(得分:1)
您得到的错误可能是由于某些拼写错误(我认为是->getUsers->first()
部分),因为您粘贴的代码在到达unknown column event_id
部分时会抛出数据库错误->tickets
。
首先解决这个问题,然后:
要使其工作,您需要在关系中指定外键,因为Eloquent使用在getForeignKey()
类上覆盖的Pivot
来猜测它并返回不同的值(event_id
in这种情况):
class UserEvent extends Pivot{
protected $table = 'user_event';
public function tickets() {
return $this->hasMany('Ticket', 'user_event_id');
}
}