【问题标题】:Laravel 5.6 - One to many relationLaravel 5.6 - 一对多关系
【发布时间】:2018-06-05 00:57:44
【问题描述】:

我正在学习 laravel 和 php。我有一个成员对象,他只能有 1 种语言选项,但有多种语言选项可供选择。 成员对象是我的主要对象。我想测试我是否正确设置了我的关系,但在测试时没有看到所需的结果(我应该只看到在语言字段中选择的语言,而不是每个成员的所有列属性,如下所示)。所以这是我的 show.blade.php 文件的输出:

这是我的 show.blade.php 文件:

@extends('layouts.master')

@section('title', $member->name)

@section('content')
    <h1>Member Details: </h1>
    <p>Name: {{$member->name}}</p>
    <p>Surname: {{$member->surname}}</p>
    <p>ID Nr: {{$member->id_number}}</p>
    <p>Mobile Nr: {{$member->mobile_number}}</p>
    <p>Email: {{$member->email}}</p>
    <p>D.O.B: {{$member->date_of_birth}}</p>
    <p>Language:{{$member->language}}</p>
    <p>Created At: {{$member->created_at}}</p>
    <div class="page-header">
        <a href="{{action('MemberController@edit', $member->id)}}" class="btn btn-info">Edit</a>
    </div>
@endsection

这是我的语言表迁移文件:

public function up()
    {
        Schema::create('languages', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('member_id')->unsigned();
            $table->string('name');
            $table->timestamps();
        });

        Schema::table('languages', function(Blueprint $table) {
            $table->foreign('member_id')->references('id')->on('members');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('languages', function(Blueprint $table) {
            $table->dropForeign('languages_member_id_foreign');
        });
        Schema::dropIfExists('languages');
    }

这是我的成员表迁移文件:

public function up()
    {
        Schema::table('members', function (Blueprint $table) {
            $table->string('name');
            $table->string('surname');
            $table->string('id_number')->unique();
            $table->string('mobile_number');
            $table->string('email');
            $table->date('date_of_birth');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('members', function (Blueprint $table) {
            $table->dropColumn('name');
            $table->dropColumn('surname');
            $table->dropColumn('id_number')->unique();
            $table->dropColumn('mobile_number');
            $table->dropColumn('email');
            $table->dropColumn('date_of_birth');
        });
    }

最后是我的成员模型:

class Member extends Model
{
    public function language() {
        return $this->hasMany('App\Language');//('Language') = name of the Language Model
    }
}

我哪里错了?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您看到对象的 JSON 表示的原因是,当您输入 {{$member-&gt;language}} 时,这就是您在代码中要求的全部内容。这代表整个App\Language 对象。

    尝试使用{{$member-&gt;language-&gt;first()-&gt;name}} 来指定您只要求对象的name 变量。

    为了显示所有语言,您需要循环使用$member-&gt;language 集合:

    @foreach ($member->language as $language)
        {{ $language->name }}
    @endforeach
    

    【讨论】:

    • 谢谢。当我在我的显示文件中添加上面指定的名称时,我收到以下错误:“此集合实例上不存在属性 [名称]。(查看:G:\laragon\www\tomcrud\resources\views\members\ show.blade.php)"。但是在我的语言表中指定了名称列?
    • 我的错误。试试{{$member-&gt;language-&gt;first()-&gt;name}}。您正在处理一个集合,并且需要在尝试使用其中的对象之前获得第一个结果(即使只有一个结果)。
    • 我的表结构是不是全错了?如果一个成员只能有一种语言,但一种语言可以有很多成员,我不应该 1)删除语言表中的 member_id 列,2)在成员表中添加一个 language_id 吗? 3)我还必须在语言模型中定义关系吗?根据 laravel 文档,外键似乎是自动定义的。这是正确的吗?
    • 我认为使用数据透视表使用多对多关系会更有用,这样一种语言可以被多人使用并且人们可以使用多种语言。
    • 背景:我正忙于一个 laravel CRUD 测试,如果我通过的话,我可以加入我们的开发团队。此测试的要求之一是成员只能从多个语言选项中选择一种语言。所以我需要在这些限制内移动。
    猜你喜欢
    • 2018-11-14
    • 2018-12-12
    • 2018-12-14
    • 1970-01-01
    • 2018-10-18
    • 2018-06-15
    • 2018-09-27
    • 2017-12-24
    • 2018-04-20
    相关资源
    最近更新 更多