保存时如何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