Laravel多重关系



我正在研究laravel/vue中的聊天应用程序,在这个应用程序中,我有用户,每个用户有几个房间,每个房间至少有2个用户,其中有几个消息,我试图建立关系或查询,以获得每个用户的所有房间和其中的消息

Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->enum('status',['active','busy','Do Not Disturb']);
$table->timestamp('email_verified_at')->nullable();
$table->string('image')->default('user0.jpg');
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('rooms', function (Blueprint $table) {
$table->id();
$table->string('room_unique');
$table->foreignId('user_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});
Schema::create('messages', function (Blueprint $table) {
$table->id();
$table->enum('type',['text','image','link']);
$table->string('content');
$table->foreignId('user_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
$table->foreignId('room_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});

你拥有的很好。我只要从房间里拿出外钥匙user_id,通过用户的留言进入他们的房间。因此,messages将像一个数据透视表,使得用户和房间之间的关系是多对多的。

因此要访问用户的房间,我将

$rooms = User::find(1)->rooms()->get();

访问房间内的用户

$users = Room::find(1)->users()->get();

显示每个房间的用户消息就像访问数据透视表一样。因此

$user = User::find(1);
foreach ($user->rooms as $rooms) {
echo $rooms->pivot->content;
}

这是多对多关系,信息是透视表。我将继续阅读文档以了解更多细节。

我找到的最好的解决方案是使复杂的关系像这样//关系

public function message() 
{
return $this->hasMany(messages::class)->take(1);
}
public function friends()
{
return $this->belongsToMany(User::class, 'friends', 'user_id', 'friend_id');
}
public function rooms()
{
return $this->belongsToMany(Room::class,'user_room','user_id','room_id');
}
public static function getInit()
{
//get room of auth user
$rooms =   DB::table('user_room')->where('user_id',Auth::id())->select('room_id')->get()->toArray();
//flatten the array
$roomArray = array_column(json_decode(json_encode($rooms), true),'room_id');
//get users friends and rooms belong to auth user with the last message 
$user = User::with(array('friends.rooms' => function($query) use ($roomArray){
$query->whereIn('rooms.id',$roomArray);
},'friends.rooms.messages' => function($query) {
$query->orderBy('created_at','Desc');
}))->whereId(Auth::id())->get()->toArray();
return $user;
}

in getinit我只是把这个关系放在彼此后面,像(friends。rooms)

laravel将使用朋友关系然后每个结果将使用房间关系在我的例子中我只需要选择房间,用户和朋友所以我有限的关系通过在房间属于身份验证的用户就像如果我们说认证用户房间2,3,4和他的朋友有3个,1、5的空间关系将只返回联盟认证用户和朋友房间在我们的案例中是3然后我返回消息在每个房间,但设计的目的我只需要为每一个房间,所以我的最后一条消息将我的关系消息限制为1,并按创建的日期顺序排序

最新更新