Laravel 获取自定义模型属性无效

Laravel get custom model attribute not working

完全相同的事情适用于应用程序中的其他模型,但不适用于这个,我不明白为什么。当我尝试访问 clientname 属性时,它是空白的。

型号

class Domain extends Model {

protected $guarded = [];

public function clients() {
    return $this->belongsTo('App\Client');
}

public function getClientNameAttribute() {
    return Client::where('id', $this->client_id)->value('name');
}

}

Blade

  <tbody>
            @foreach( $domains as $domain )
            {!! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('domains.index', $domain->id))) !!}
            <tr>
                <td><a href="{{ route('domains.show', $domain->id) }}">{{ $domain->id }}</a></td>
                <td>{{ $domain->name }}</td>
                <td>{{ $domain->clientname }}</td>
                <td>{{ $domain->expiry_date }}</td>
                <td>  {!! link_to_route('domains.edit', 'Edit', array($domain->id), array('class' => 'btn btn-info')) !!}
                    </td>
            </tr>
            {!! Form::close() !!}

            @endforeach
        </tbody>

编辑以添加 client/domain 架构

客户

    Schema::create('clients', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('kashflow_id')->unique();
        $table->string('name');
        $table->string('contact');
        $table->string('telephone');
        $table->string('mobile');
        $table->string('fax');
        $table->string('email');
        $table->string('address1');
        $table->string('address2');
        $table->string('address3');
        $table->string('address4');
        $table->string('postcode');
        $table->timestamps();
    });

            Schema::create('domains', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('client_id')->unsigned();
        $table->foreign('client_id')->references('id')->on('clients');
        $table->string('name');
        $table->date('expiry_date');
        $table->timestamps();
    });

你试过了吗?

public function getClientNameAttribute() {
    return Client::where('id', $this->client_id)->first()->name;
}

如果你的模特看起来像

class Domain extends Model {


    public function client() {
        return $this->belongsTo('App\Client');
    }

    public function getClientNameAttribute()
    {
        $client = $this->client;
        return $client ? $client->name : '';
    }

}

下面的代码必须正常工作(没有错误)

<tbody>
    @foreach( $domains as $domain )
    {!! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('domains.index', $domain->id))) !!}
    <tr>
        <td><a href="{{ route('domains.show', $domain->id) }}">{{ $domain->id }}</a></td>
        <td>{{ $domain->name }}</td>
        <td>{{ $domain->client_name }}</td>
        <td>{{ $domain->expiry_date }}</td>
        <td>  {!! link_to_route('domains.edit', 'Edit', array($domain->id), array('class' => 'btn btn-info')) !!}
            </td>
    </tr>
    {!! Form::close() !!}

    @endforeach
</tbody>

如果任何与域 $domain->client_name 关联的客户端将 return 他的名字,否则 ''

你应该像这样定义这个访问器:

public function getClientNameAttribute() 
{
    return ($client = $this->clients) ? $client->name : '';
}

然后第二件事是在 Blade 中你应该像这样使用它:

$domain->client_name

带蛇壳。

显然也没有必要建立 clients 关系。它的名称应该是 client

您访问的方式有误。以蛇形大小写访问属性名称。所以,你应该使用:

$domain->client_name

我删除了我的 table 并进行了新的迁移,现在一切正常,感谢所有试图提供帮助的人

添加新评论已经很晚了,但我一直希望有人能提供帮助。

我运行遇到了这个问题,我通过改变函数的签名解决了这个问题,从一个没有参数的函数变成了一个只有一个参数的函数,这个参数是要格式化的列的数据.

传递这个函数

public function getRejectedAttribute()
{
    return $this->rejected ? true : false;
}

到这个其他函数

public function getRejectedAttribute($nRejected)
{
    return $nRejected ? true : false;
}