Laravel отношения получают электронные письма пользователей - PullRequest
0 голосов
/ 07 января 2019

Привет со своего веб-сайта. Я отправляю пользователям несколько уведомлений, назначаю пользователей в группу, а затем назначаю эту команду в таблицу уведомлений.

Однако, когда я делаю SiteNotification::find(1)->notifications(), тогда я получаю название команды, однако я искал модель пользователя и все детали, связанные с этим. Есть ли простой способ получить это, используя отношения Laravel Eloquent?

Моя модель БД и модель Eloquent ниже;

таблицы БД;

Пользователь

id | username | email

Команда

id | name |

Члены команды

team_id | user_id

Уведомления сайта

site_notification_id | team_id

Модель здесь:

class SiteNotification extends Model {

public function notifications()
{
    return $this->belongsToMany(Team::class, 'site_check_notifications', 'site_check_id', 'team_id');
}

}

Обновление:

Я попытался обновить модель команды следующим образом;

class Team extends Model
{

    public function users()
    {
        return $this->hasManyThrough(
            User::class,
            TeamMember::class,
            'team_id',
            'id'
        );
    }
}

Однако при выполнении этого выдается следующее сообщение об ошибке;

    $site = Site::find(1);

foreach( $site->notifications as $notification) {
    dd($notification->users);
}

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'team_members.id' in 'on clause' (SQL: select `users`.*, `team_members`.`team_id` from `users` inner join `team_members` on `team_members`.`id` = `users`.`id` where `team_members`.`team_id` = 4)

Есть идеи, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я нашел решение, которое означало, что мне не нужно вносить изменения в мою существующую структуру базы данных, и я нашел правильное соотношение для использования.

public function users()
    {
        return $this->belongsToMany(
            User::class,
            'team_members',
            'team_id',
            'user_id'
        );

    }

Теперь я могу сделать Site::find(1)->users->pluck('email')

0 голосов
/ 08 января 2019

Вы должны изменить структуру модели ... Вот как бы я достиг вашей цели ... Воспринимайте это как "рабочее решение", может быть, не самое лучшее!

Прежде всего, база данных. Вы должны иметь эти таблицы, нет необходимости

users                    => users table
teams                    => teams table
team_user                => pivot table n:n
team_site_notification   => pivot table n:n
site_notifications       => notifications table
user_site_notification   => pivot table n:n

Затем вы создаете отношения связанных моделей

public class User {
    // [...]
    public function teams() {
        return $this->belongsToMany(Team::class)
    }

    public function notifications() {
        return $this->belongsToMany(SiteNotification::class)
    }
}

public class Team {
    // [...]
    public function users() {
        return $this->belongsToMany(User::class)
    }

    public function notifications() {
        return $this->belongsToMany(SiteNotification::class)
    }
}

public class SiteNotification {
    // [...]
    public function teams() {
        return $this->belongsToMany(Team::class)
    }

    public function users() {
        return $this->belongsToMany(User::class)
    }
}

В вашем контроллере, когда вы создаете модель SiteNotification, вам нужно будет также связать пользователей. Например

public function store(Request $request) {
   // Do your stuff
   $team = Team::findOrFail($request->your_team_id);
   $notification = Notification::create($data);

   $notification->teams()->associate($request->your_team_id);

   // Retrieve the users from the team... Maybe not everyone should receive a notification
   $team->users()->whereIn('id', $user_ids)->get()->pluck('id')
   $notification->users()->associate($ids);
}

Когда вы хотите получить список пользователей, вы просто извлекаете связанных пользователей следующим образом:

dd($notification->users);

// [ User:{id: 1, '...'}, User:{id: 2}, User:{id: 7} ]

Надеюсь, это то, что вы ищете!

...