#php #laravel #collections
#php #laravel #Коллекции
Вопрос:
У меня есть 3 таблицы:
Пользователи:
Schema::create('users', function (Blueprint $table) {
$table->unsignedInteger('id')->unique();
$table->string('name', 50)->nullable();
$table->timestamps();
});
Беседы:
Schema::create('conversations', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('token', 50)->nullable();
$table->timestamps();
});
И пользовательская конверсия:
Schema::create('conversation_user', function (Blueprint $table) {
$table->unsignedInteger('conversation_id');
$table->unsignedInteger('user_id');
$table->dateTime('read_at')->nullable();
});
В одном диалоге может быть 2 пользователя.
У меня есть этот класс для пользователей:
class User extends Model {
public function conversations(){
return $this->belongsToMany(Conversation::class, 'conversation_user', 'user_id', 'conversation_id');
}
public function getConversationWith($user_id){
return $this->conversations()->whereHas('users', function ($q) use ($user_id) {
$q->where('ml_users.user_id', $user_id);
})->first();
}
}
Моя проблема: мне нужно изменить метод getConversationWith() на:
public function getConversationWith($user_id){
return $this->conversations->where('users.user_id', $user_id)->first();
// Or this
return $this->conversations->whereIn('users.user_id', [$this->id, $user_id])->first();
}
Для получения разговоров с заданным идентификатором пользователя.
Есть ли способ сделать это с коллекциями?
Заранее благодарю
Ответ №1:
Вы можете выполнить это, как показано ниже, но это не будет хорошо работать, если у вас большой набор данных.
class User extends Model
{
public function conversations()
{
return $this->belongsToMany(Conversation::class, 'conversation_user', 'user_id', 'conversation_id');
}
public function getConversationWith($user_id)
{
// conversation IDs from target user
$conversationIds = Conversation::whereHas('user', function($query) use ($user_id)
{
$query->where('users.id', $user_id);
})->pluck('id')->toArray();
// all conversations from the current user where target user has participated
return $this->conversations()->whereIn('conversations.id', $conversationIds)->get();
}
}
Надеюсь, это помогло!