#laravel #eloquent #relationship
#laravel #красноречивый #связь
Вопрос:
Я только что создал профиль для пользователей и хочу показать сведения об образовании, связанные с зарегистрированным пользователем или другим выбранным пользователем.
для этого я создал модель обучения для пользователей и установил с ней правильные отношения с обеих сторон. я не могу получить какие-либо данные из таблицы образования зарегистрированного пользователя или другого пользователя. я использовал тег foreach в файле блейда. пожалуйста, просмотрите мой код. Спасибо.
Модель обучения
class Education extends Model
{
use HasFactory;
protected $primaryKey = 'education_id';
public function myusers()
{
return $this->belongsTo('AppModelsUser','user_id','education_id');
}
}
Пользовательская модель
public function myeducation()
{
return $this->hasMany('AppModelsEducation','education_id','user_id');
}
Контроллер профиля
public function index()
{
$user = Auth::user();
return view('candidate.profile',['user'=>$user,]);
}
Блейд-файл
@foreach ($user->myeducation as $education)
<div>
{{ $education->school }}
</div>
@endforeach
Структура таблицы образования и пользователей
**Education Table**
{
Schema::create('education', function (Blueprint $table) {
$table->bigIncrements('education_id');
$table->bigInteger('user_id');
$table->string('school');
$table->string('degree');
$table->string('fieldOfStudy');
$table->date('startDate');
$table->date('endDate');
$table->string('grade');
$table->string('activities');
$table->string('description');
$table->timestamps();
});
}
пользовательская таблица.
$table->increments('user_id');
$table->bigInteger('role_id');
$table->bigInteger('membership_id')->nullable();
$table->string('firstname');
$table->string('lastname');
сообщения об ошибке нет, просто пустое
Table entries
DB::table('education')
'user_id' => '2',
'school' => 'University of Bedfordshire',
'degree' => 'MBA',
]);
DB::table('users')->insert([
'user_id' => '1',
'role_id' => '1',
'firstname' => 'Mohammed',
'lastname' => 'Sabeel',
.......
]);
DB::table('users')
' user_id' => '2'
'role_id' => '2',
'firstname' => 'zahida',
'lastname' => 'sabeel',
.......
]);
Комментарии:
1. Как выглядят ваши таблицы? Ключи кажутся немного странными для отношений. У вас есть
user_id
иeducation_id
которые звучат как два разных значения. Ключи должны представлять одно и то же значение в обеих таблицах (например, переменные модели$user->id
===$education->user_id
). Если это утверждение уже верно, то вам не нужно вручную определять ключи, поскольку Laravel сделает это за вас.2. привет @matticustard. user> user_id и Education> user_id имеют одинаковые значения. и ключи уже введены вручную. пожалуйста, проверьте структуру таблицы, прикрепленную к моему вопросу. Спасибо
Ответ №1:
проблема заключается во втором и третьем аргументе в ваших отношениях. вы неправильно передаете ключи.
в Education
модели используйте код, подобный
public function myUser()
{
return $this->belongsTo('AppModelsUser', 'user_id');
}
вам не нужно передавать третий аргумент, если вы используете первичный ключ для связи. хотя вы можете передать третий аргумент, чтобы определить, какой столбец использовать для объединения таблиц
public function myUser()
{
return $this->belongsTo('AppModelsUser', 'user_id', 'user_id');
// second argument user_id is from your education model while the third argument that is user_id is the primary key of your user model
// i have used singular name for the relationship name with camel case
}
теперь в User
модели
public function myEducations()
{
return $this->hasMany('AppModelsEducation', 'user_id');
// user_id is the user_id of education model
// and this is a has many relation i used plural form
}
подробнее об отношениях читайте в laravel doc
Комментарии:
1. большое вам спасибо. это помогло мне. и теперь я вижу результаты.
Ответ №2:
Прежде чем мы начнем, убедитесь, что у вас есть образование, связанное с этим зарегистрированным пользователем.
Попробуйте нетерпеливо загрузить ваши отношения. Когда-то это работало для меня.
В вашем контроллере профиля,
public function index()
{
$user = Auth::user()->load('myeducation');
return view('candidate.profile',['user'=>$user,]);
}
Даже если это не сработало, пожалуйста, поделитесь своей структурой таблицы и записями таблицы. Чтобы мы могли четко изучить.
Комментарии:
1. это не работает. пожалуйста, проверьте структуру таблицы