Laravel:向枢轴模型添加关系

Posted

技术标签:

【中文标题】Laravel:向枢轴模型添加关系【英文标题】:Laravel: Adding relationships to a pivot model 【发布时间】:2014-08-17 10:43:08 【问题描述】:

如何向数据透视模型添加关系?

我有以下表格:

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 不可能做到这一点?

【问题讨论】:

你成功了吗? 【参考方案1】:

您得到的错误可能是由某些拼写错误引起的(我猜是->getUsers->first() 部分),因为您粘贴的代码在到达->tickets 部分时应该抛出DB 错误unknown column event_id

所以先解决这个问题,然后:

要使其工作,您需要在关系中指定外键,因为 Eloquent 使用 getForeignKey() 猜测它,它在 Pivot 类上被覆盖并返回不同的值(在这种情况下为 event_id):

class UserEvent extends Pivot
    protected $table = 'user_event';
    public function tickets() 
        return $this->hasMany('Ticket', 'user_event_id'); 
    

【讨论】:

晚安,先生。我想知道我的案例here 是否可以通过这种解决方案实现。亲爱的先生,我可以向您寻求帮助吗?

以上是关于Laravel:向枢轴模型添加关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 枢轴关系

Laravel 根据枢轴额外字段从枢轴附加/分离模型

Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)

Laravel Eloquent 嵌套关系枢轴与约束

Laravel中的多重关系(枢轴)

三向枢轴表 Laravel