保存时如何return年级table的名称json?
How to return name of table of grade when save like json?
我有两个table,用户和等级。
用户table
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
$table->string('grade_id')->nullable();
}
}
成绩table
public function up()
{
Schema::create('grades', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
我用json_encode
,
保存年级id
我这样保存在字段中
$user->grade_id = json_encode($request->input('grade_id'));
我想returngrade name
但是我没有解决我的问题
控制器
public function index()
{
$grades = Grade::all();
return view('index', compact('grades');
}
User.php
public function grade()
{
return $this->belongsTo(Grade::class);
}
index.blade.php
@if(isset(auth()->user()->grade_id) && !empty(auth()->user()->grade_id))
<?php
$grade = json_decode(auth()->user()->grade->name, true);
@foreach($grade as $key=>$item)
<li>
<div class="grade">{{ $grade[$key] }}</div>
</li>
@endforeach
?>
@endif
我得到这个错误
Trying to get property of non-object
错误答案
您在用户 table 中保存了一个 ID 数组。然后,当您执行 $grade = json_decode(auth()->user()->grade->name)
时,您会得到一些您不想拥有的东西。的确,auth()->user()->grade
的值为["8", "8"]
,这不是等级模型。现在你应该明白为什么这个 $grade = json_decode(auth()->user()->grade->name)
失败了:你试图得到一个非 object 的 name
属性(因为 user()->grade
只是一个数组)。
要严重解决它(请阅读我的答案的下一部分),您可以在控制器中执行此操作(您不应该在视图文件中执行任何 <?php ?>
):
public function index()
{
$grades_ids = json_decode(auth()->user()->grade); // ["8", "8"]
$grades = Grade::whereIn('id', $grades_ids)->get(); // Eloquent collection
return view('index', compact('grades');
}
并在您的视图中使用它:
@if($grades->count())
<ul>
@foreach($grades as $grade)
<li>
<div class="grade">{{ $grade->id }}</div>
</li>
@endforeach
</ul>
@endif
回答得好
这里有一个典型的多对多关系。一个等级可以有多个用户,一个用户可以有多个等级。那么你应该想到 using a pivot table 而不是在 json.
中编码几个 grade_id
创建 users
table:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
}
}
然后创建成绩 table:
public function up()
{
Schema::create('grades', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
然后你创建新的 user_grade_table
:
public function up()
{
Schema::create('user_grade', function (Blueprint $table) {
$table->primary(['user_id', 'grade_id']);
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('grade_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('grade_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::table('user_grade', function (Blueprint $table) {
$table->dropPrimary('user_grade_user_id_grade_id_primary');
$table->dropForeign('user_grade_user_id_foreign');
$table->dropForeign('user_grade_grade_id_foreign');
});
Schema::dropIfExists('user_grade');
}
不要忘记 运行 迁移。完成后,您必须更新模型,在两个模型上添加 belongs to many。
用户模型
public function grades()
{
return $this->belongsToMany(Grade::class, 'user_grade', 'user_id', 'grade_id');
}
等级模型相同:
public function users()
{
return $this->belongsToMany(User::class, 'user_grade', 'grade_id', 'user_id');
}
您终于可以在 blade 文件中使用它了:
@if($grades = auth()->user()->grades)
<ul>
@foreach($grades as $grade)
<li>
<div class="grade">{{ $grade->name }}</div>
</li>
@endforeach
</ul>
@endif
我有两个table,用户和等级。
用户table
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
$table->string('grade_id')->nullable();
}
}
成绩table
public function up()
{
Schema::create('grades', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
我用json_encode
,
我这样保存在字段中
$user->grade_id = json_encode($request->input('grade_id'));
我想returngrade name
但是我没有解决我的问题
控制器
public function index()
{
$grades = Grade::all();
return view('index', compact('grades');
}
User.php
public function grade()
{
return $this->belongsTo(Grade::class);
}
index.blade.php
@if(isset(auth()->user()->grade_id) && !empty(auth()->user()->grade_id))
<?php
$grade = json_decode(auth()->user()->grade->name, true);
@foreach($grade as $key=>$item)
<li>
<div class="grade">{{ $grade[$key] }}</div>
</li>
@endforeach
?>
@endif
我得到这个错误
Trying to get property of non-object
错误答案
您在用户 table 中保存了一个 ID 数组。然后,当您执行 $grade = json_decode(auth()->user()->grade->name)
时,您会得到一些您不想拥有的东西。的确,auth()->user()->grade
的值为["8", "8"]
,这不是等级模型。现在你应该明白为什么这个 $grade = json_decode(auth()->user()->grade->name)
失败了:你试图得到一个非 object 的 name
属性(因为 user()->grade
只是一个数组)。
要严重解决它(请阅读我的答案的下一部分),您可以在控制器中执行此操作(您不应该在视图文件中执行任何 <?php ?>
):
public function index()
{
$grades_ids = json_decode(auth()->user()->grade); // ["8", "8"]
$grades = Grade::whereIn('id', $grades_ids)->get(); // Eloquent collection
return view('index', compact('grades');
}
并在您的视图中使用它:
@if($grades->count())
<ul>
@foreach($grades as $grade)
<li>
<div class="grade">{{ $grade->id }}</div>
</li>
@endforeach
</ul>
@endif
回答得好
这里有一个典型的多对多关系。一个等级可以有多个用户,一个用户可以有多个等级。那么你应该想到 using a pivot table 而不是在 json.
中编码几个grade_id
创建 users
table:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
}
}
然后创建成绩 table:
public function up()
{
Schema::create('grades', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
然后你创建新的 user_grade_table
:
public function up()
{
Schema::create('user_grade', function (Blueprint $table) {
$table->primary(['user_id', 'grade_id']);
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('grade_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('grade_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::table('user_grade', function (Blueprint $table) {
$table->dropPrimary('user_grade_user_id_grade_id_primary');
$table->dropForeign('user_grade_user_id_foreign');
$table->dropForeign('user_grade_grade_id_foreign');
});
Schema::dropIfExists('user_grade');
}
不要忘记 运行 迁移。完成后,您必须更新模型,在两个模型上添加 belongs to many。
用户模型
public function grades()
{
return $this->belongsToMany(Grade::class, 'user_grade', 'user_id', 'grade_id');
}
等级模型相同:
public function users()
{
return $this->belongsToMany(User::class, 'user_grade', 'grade_id', 'user_id');
}
您终于可以在 blade 文件中使用它了:
@if($grades = auth()->user()->grades)
<ul>
@foreach($grades as $grade)
<li>
<div class="grade">{{ $grade->name }}</div>
</li>
@endforeach
</ul>
@endif