Laravel 多对多关系不起作用

Posted

技术标签:

【中文标题】Laravel 多对多关系不起作用【英文标题】:Laravel Many-to-Many relationship not working 【发布时间】:2021-12-08 05:46:48 【问题描述】:

我在 Laravel 关系中遇到了一个奇怪的问题。

我想参加一个有很多用户的活动(完美)。

<?php

$event_with_user = Event::with('registered_users')->where('id', 253)->get();
dd($event_with_user);

我想通过所有相关事件访问用户:

<?php

$user_with_event = User::with('registered_events')->where('id', 1)->get();
        dd($user_with_event);

我总是收到此错误:

Illuminate\Database\Eloquent\RelationNotFoundException “调用模型 [App\User] 上的未定义关系 [registered_events]。”

我多次检查关系,但找不到错误。其他人有这个问题吗?


我的模特

User.php

<?php

namespace App;

use App\Event;
use App\UserType;
use App\EventUser;
use App\Department;
use App\Evaluation;
use App\UserLocation;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fname', 'lname', 'email', 'password', 'phone', 'email_verified_at', 'admin', 'user_type_id', 'last_login_at', 'last_login_ip', 'user_location_id', 'user_notification_type_id', 'user_notification_setting_id', 'slack_user_id', 'joinpoints_user_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function registered_events() 
    
        return $this->belongsToMany(Event::class, 'event_user', 'event_id', 'user_id'); 
    



Event.php

<?php

namespace App;

use App\User;
use App\EventRoom;
use App\EventType;
use App\EventStatus;
use App\EventLocation;
use App\EventParticipant;
use App\EventParticipantItems;
use Illuminate\Database\Eloquent\Model;
use Cviebrock\EloquentSluggable\Sluggable;

class Event extends Model

    use Sluggable;

    protected $fillable = [
        'event_type_id', 'user_id', 'status', 'customer', 'slug', 'datetime', 'duration','embed_chat','number_of_participants','heading', 'description_1', 'description_2', 'livestream_link', 'logo_link', 'event_password', 'participants_per_room', 'youtube_id', 'embed_code', 'session_link', 'hide_breakout', 'help_link', 'lang', 'layout', 'btn2_text', 'btn2_link', 'help_text', 'background_url', 'black_font',
    ];

    protected $dates = ['datetime'];

    public function getRouteKeyName()
    
        return 'slug';
    

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    
        return [
            'slug' => [
                'source' => 'customer'
            ]
        ];
    

    public function registered_users() 
    
        return $this->belongsToMany(User::class, 'event_user', 'user_id', 'event_id')->withPivot('id', 'user_status', 'eventmanager', 'created_at', 'updated_at');
    

  

我的表:

用户:id,.... 事件:ID,... event_user:id、user_id、event_id、...

【问题讨论】:

尝试清除缓存。 php artisan view:clear. 尝试清除缓存以及作曲家转储自动加载。没有任何改变:( 您能否尝试将关系名称从registered_events 更改为events 【参考方案1】:

仔细看看你的模型:

return $this->belongsToMany(Event::class, 'event_user', 'event_id', 'user_id'); 

return $this->belongsToMany(User::class, 'event_user', 'event_id', 'user_id');

虽然表格是正确的,但您需要在其中一个上交换 event_id 和 user_id 的顺序...

【讨论】:

抱歉,我已经编辑了我的问题。当然,我已经在 Event::class 上将 'user_id' 与 'event_id' 交换了。不幸的是,这并不能解决我的问题:(【参考方案2】:

看起来你交换了(外)键:

User.php

public function registered_events() 

    return $this->belongsToMany(Event::class, 'event_user', 'user_id', 'event_id'); 

Event.php中:

public function registered_users() 

    return $this->belongsToMany(User::class, 'event_user', 'event_id', 'user_id')->withPivot('id', 'user_status', 'eventmanager', 'created_at', 'updated_at');

当你遵循正确的 Laravel 数据库结构时,你可以简单地把 return $this-&gt;belongsToMany(Event::class);User.phpreturn $this-&gt;belongsToMany(User::class)-&gt;withPivot(...);Event.php

【讨论】:

确实,但是当我尝试访问 user->registered_events 时仍然出现同样的错误 :( 可能与 Event 模型中的 getRouteKeyName() 有关。我没有使用此自定义密钥 (laravel.com/docs/8.x/routing#customizing-the-default-key-name) 的经验。它是否会在多对多关系上产生冲突?可能是。选择退出,看看它是否能解决问题。在控制器中,您可以搜索特定列“slug”。

以上是关于Laravel 多对多关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 多对多关系不起作用(没有抛出错误)

博客上的 Laravel 5.1 多对多标签不起作用

SQL Server Analysis Services 中的多对多关系;第二个多对多关系不起作用

NSFetchedResultsController 和多对多关系不起作用

Laravel 雄辩的关系多对一不起作用

Laravel 外键 onDelete('cascade') 不起作用