【问题标题】:Is reverse relation possible in laravel?在 laravel 中是否可能存在反向关系?
【发布时间】:2021-06-13 23:23:19
【问题描述】:

我不确定它的名字是否是反向关系,但是

我的事件模型包含:

public function venue()
    {
        return $this->hasOne('App\Models\Venue', 'id','venue_id');
    }

所以基本上我可以使用事件模型访问场地数据,但我也想访问特定场地的所有事件数据。我知道我可以通过查询等来做到这一点,但是否可以通过关系做到这一点。

事件迁移

        $table->id();
        $table->string('name');
        $table->string('slug')->unique();
        $table->unsignedBigInteger('venue_id');
        $table->decimal('price');
        $table->text('content');
        $table->timestamps();
        $table->foreign('venue_id')->references('id')->on('venues');

场地迁移

        $table->id();
        $table->string('name')->unique();
        $table->string('slug')->unique();
        $table->string('address');
        $table->text('about');
        $table->timestamps();

事件模型

public function venue()
{
    return $this->hasOne('App\Models\Venue', 'id','venue_id');
}

场地模型

public function events()
{
   return $this->belongsTo(Event::class, 'venue_id','id');
}

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    是的,有可能。你可以使用belongsTo

    场地

    public function events() {    
    return $this->hasOne(Event::class); 
    }
    

    活动

    public function venue()
    {
       return $this->belongsTo(Venue::class);
    }
    

    然后你可以像下面这样访问

    $venue = Venue::with('events')->where('slug',$venue_slug)->get();
    
    foreach($venue as $key=>$value){
     
    dd($value->events);
    
    }
    

    【讨论】:

    • 我收到类似这样的错误“此集合实例上不存在属性 [事件]。”
    • 你能说明你是如何访问的吗? .您必须在 Venue 模型中定义此关系
    • $venue = Venue::where('slug',$venue_slug)->get();
    • $venue = Venue::with('event')->where('slug',$venue_slug)->get();
    • 然后你可以在循环中访问事件,例如 foreach($venue as $key=>$value){ dd($value->event);}
    【解决方案2】:

    是的!由于一个场地可以有多个活动,您可以在Venue 模型中定义这样的关系:

    public function events()
    {
        return $this->belongsTo(Event::class);
    }
    

    见:https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-inverse

    【讨论】:

    • 您好,感谢您的回答,我收到类似“此集合实例上不存在属性 [events] 的错误。”
    • 你可以试试Venue::with('event')->where('slug',$venue_slug)->get();,而不是Venue::where('slug',$venue_slug)->with('event')->get();? (如果关系名称是事件,那么请使用events而不是event
    • 不幸的是它返回 null
    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 2018-11-19
    • 2020-06-21
    • 2014-08-24
    • 2015-12-04
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多