В Laravel мне нужно присоединиться к моделям и по-прежнему использовать методы на первой модели

Таким образом, у меня есть модель "Пользователь" и "настройка пользователя". модель "usersettings" имеет столбец с именем "users_id", чтобы связать его с моделью пользователя.

Я использую модуль прав доступа и ролей...

Так что в модели пользователей у меня есть

use Spatie\Permission\Traits\HasRoles;


class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use HasRoles;
......
public function usersettings()
    {
        #return $this->hasOne('\App\usersettings','users_id');
        return $this->belongsTo('\App\usersettings','users_id');
    }
}

В пользовательской настройке модели у меня есть

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;

class usersettings extends Model
{
    use HasRoles;

    protected $guard_name = 'web'; // or whatever guard you want to use
        protected $table = 'usersettings';

        protected $fillable = [
        'users_id','stripe_customer',
    ];

    //
}

И в моем контроллере у меня есть

public function chooseUser(Request $request){

        $theuserID = $request->input('id');
        \Log::info('The User ID:'.$theuserID);
        $whichuser = \App\User::find($theuserID)->with('usersettings')->get();
        $whichuser2 = \App\User::find($theuserID);

        /*if($isadmin = $whichuser2->hasRole('admin')){
            $whichuser->admin ='isadmin';
        }*/

        #\Log::info('THE HAVE:'.$isadmin);

        \Log::info('THE USER:'.$whichuser);
        #$roles = $whichuser->getRoleNames();
        #\Log::info('THE USER:'.$roles);

        return $whichuser;
    }

Моя цель - вернуть всю пользовательскую информацию с пользовательскими настройками, а также узнать, есть ли у пользователя роль администратора. Я не смог понять, как соединить все три.

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

Спасибо R

1 ответ

Вот некоторые проблемы, которые вам нужно решить.

  1. Пользователь - Настройки пользователя ( Один - Много Отношений)

Вы можете думать, что у пользователя много пользовательских настроек, а пользовательские настройки принадлежат пользователю.

В пользовательской модели вы должны определить это отношение:

public function usersettings() {
    return $this->hasMany('\App\usersettings', 'users_id');
}

В модели пользовательских настроек вы должны определить эту обратную зависимость:

public function user() {
    return $this->belongsTo('App\User', 'users_id');
}
  1. Запрашиваемая связь

Когда вы получаете доступ к отношениям, вы можете просто получить доступ к отношениям, как если бы они были собственностью. Если вы обращаетесь к взаимосвязи пользовательских настроек, тип возвращаемого значения - Illuminate \ Database \ Eloquent \ Collection.

$whichuser = \App\User::find($theuserID);
$userSettings = $whichuser->usersettings;
  1. Нетерпеливая загрузка

Ты используешь with неверным образом, вы должны проверить нетерпеливую загрузку:

При доступе к отношениям Eloquent в качестве свойств данные отношений "загружаются лениво". Это означает, что данные отношения фактически не загружаются, пока вы не получите первый доступ к свойству. Однако Eloquent может "загружать" отношения во время запроса родительской модели. Стремительная загрузка облегчает проблему запроса N + 1.

  1. Роль / Разрешение

Это правильный способ проверить, играет ли пользователь определенную роль. Вы должны полностью прочитать spatie/laravel-permission чтобы понять их использование.

if ($whichuser2->hasRole('admin')) { ... }
Другие вопросы по тегам