В 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 ответ
Вот некоторые проблемы, которые вам нужно решить.
- Пользователь - Настройки пользователя ( Один - Много Отношений)
Вы можете думать, что у пользователя много пользовательских настроек, а пользовательские настройки принадлежат пользователю.
В пользовательской модели вы должны определить это отношение:
public function usersettings() {
return $this->hasMany('\App\usersettings', 'users_id');
}
В модели пользовательских настроек вы должны определить эту обратную зависимость:
public function user() {
return $this->belongsTo('App\User', 'users_id');
}
Когда вы получаете доступ к отношениям, вы можете просто получить доступ к отношениям, как если бы они были собственностью. Если вы обращаетесь к взаимосвязи пользовательских настроек, тип возвращаемого значения - Illuminate \ Database \ Eloquent \ Collection.
$whichuser = \App\User::find($theuserID);
$userSettings = $whichuser->usersettings;
Ты используешь with
неверным образом, вы должны проверить нетерпеливую загрузку:
При доступе к отношениям Eloquent в качестве свойств данные отношений "загружаются лениво". Это означает, что данные отношения фактически не загружаются, пока вы не получите первый доступ к свойству. Однако Eloquent может "загружать" отношения во время запроса родительской модели. Стремительная загрузка облегчает проблему запроса N + 1.
- Роль / Разрешение
Это правильный способ проверить, играет ли пользователь определенную роль. Вы должны полностью прочитать spatie/laravel-permission
чтобы понять их использование.
if ($whichuser2->hasRole('admin')) { ... }