【问题标题】:How to return name of table of grade when save like json?像json一样保存时如何返回等级表的名称?
【发布时间】:2020-07-05 12:35:43
【问题描述】:

我有两个表,用户和成绩。

用户表

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();
    }
}

成绩表

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'));

我想退回grade 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

我得到了这个错误

试图获取非对象的属性

【问题讨论】:

    标签: laravel-5.8


    【解决方案1】:

    错误答案

    您在 users 表中保存了一个 id 数组。然后,当您执行$grade = json_decode(auth()-&gt;user()-&gt;grade-&gt;name) 时,您会得到您不想拥有的东西。确实,auth()-&gt;user()-&gt;grade 的值是["8", "8"],这不是等级模型。现在你应该明白为什么这个$grade = json_decode(auth()-&gt;user()-&gt;grade-&gt;name) 失败了:你试图获得一个非对象的name 属性(因为user()-&gt;grade 只是一个数组)。

    要解决这个问题(阅读我的答案的下一部分),您可以在控制器中执行此操作(您不应在视图文件中执行任何 &lt;?php ?&gt;):

    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 表:

    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();
        }
     }
    

    然后你创建你的成绩表:

    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');
    }
    

    不要忘记运行迁移。完成此操作后,您必须更新模型,在两个模型上添加属于多个模型。

    用户模型

    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');
    }
    

    最后你可以在你的刀片文件中使用它:

    @if($grades = auth()->user()->grades)
        <ul>
        @foreach($grades as $grade)
            <li>
                <div class="grade">{{ $grade->name }}</div>
            </li>
        @endforeach
        </ul>
    @endif
    

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 2016-06-24
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多