如何在Laravel模型中编写NotMapped实体?

时间:2017-05-06 11:41:23

标签: php laravel-5 model eloquent

我是 <table id="renewallist" class="display" cellspacing="0" width="100%"> <thead> <tr> <th>Insured's Name</th> <th>Department</th> <th>Policy No.</th> <th>From</th> <th>To</th> <th>S.I.</th> <th>Premium</th> <th>Description</th> <th></th> </tr> </thead> <tbody> <?php foreach ($allpol as $key => $value) { ?> <tr> <td><?php echo $value->firmname; ?></td> <td><?php echo $value->deptname; ?></td> <td class="brkwrd"><?php echo $value->polno; ?></td> <td class="w75"><?php echo date("d-m-y", strtotime($value->startdate)); ?></td> <td class="w75"><?php echo date("d-m-y", strtotime($value->enddate)); ?></td> <td>Rs. <?php echo $value->si; ?></td> <td>Rs. <?php echo $value->premium; ?></td> <td class="brkwrd"><?php echo $value->description; ?></td> <td><button type="button" class="btn btn-primary" data-toggle="modal" data-target=".pol" onclick='getpolinfo(<?php echo $value->polid; ?>)'>View Info</button></td> </tr> <?php } ?> </tbody> <tfoot> <tr> <th>Insured's Name</th> <th>Department</th> <th>Policy No.</th> <th>From</th> <th>To</th> <th>S.I.</th> <th>Premium</th> <th>Description</th> <th></th> </tr> </tfoot> </table> 的新手,因此我的问题可能对某些人来说很奇怪。好吧,我的问题是如何在Laravel laravel类中编写一个实体,在迁移后不会在数据库中创建任何字段。例如

Model

这是我的模型,现在我想添加另一个名为&#39; PagedListSize&#39;在我的模型中,但是我不想将其创建为数据库列。那我该怎么做?

例如,我熟悉在class JobseekerModel extends Model { use SoftDeletes; protected $table='dbl_jobseekers'; protected $primaryKey='id'; protected $fillable=[ 'FirstName', 'MiddleName', 'LastName', 'Dob', 'Education', 'DesireField', 'Skill', 'SpecialSkill', 'Experience', 'Location', 'HomeAddress', 'Salary', 'Comenteries', 'Resume' ]; protected $dates = ['deleted_at']; } 中使用NotMapped属性,其编写方式如

.Net Framework

那么,我该怎么做呢。在laravel有没有办法做到这一点?我正在处理[NotMapped] public int PagedListSize {set; get;}

3 个答案:

答案 0 :(得分:4)

您可以创建自定义Mutators以获得那种自定义属性,而无需将它们映射到Laravel中的数据库字段。

class Tag extends Model
{
    public function getFullNameAttribute()
    {
        return $this->first_name.' '.$this->last_name;
    }

    public function setFullNameAttribute($value)
    {
        list($this->first_name, $this->last_name) = explode(' ', $value);
    }
}

然后在初始化模型后可以像这样使用它:

$tag->full_name = "Christos Lytras";
echo $tag->first_name; // prints "Christos"
echo $tag->last_name; // prints "Lytras"

这是一个修补程序截图:

Artisan Tinker Example

答案 1 :(得分:2)

您可以将受保护的属性添加到Laravel Model中,只要它们不与字段名称冲突就可以。此外,使用Laravel,迁移是决定数据库结构而不是模型,因此您不会冒风险自动创建字段(实际上,默认模型不使用开箱即用的属性)。

编辑:默认包User.php中的示例

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
    * You can add some properties here
    * will require getter and/or setters
    * does not need to be fillable
    */
    protected $someLogicalProperty;

}

实际的db结构在迁移中定义(2014_10_12_000000_create_users_table.php):

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

如您所见,用户模型中甚至没有列出时间戳和令牌。定义时的所有可填充内容都将作为用户对象($user->name = 'Bob';上的公共属性进行设置,但您也可以将其作为参数传递给create()/ save()继承的方法)。在Laravel中不直接访问实体,但是在这里可以根据需要进一步指定。

答案 2 :(得分:0)

在Laravel中实现这一目标的最佳方法是通过custom Mutators。此外,mutator可以配置为显示在模型的json或数组输出转储中。例如对于PagedListSize,我们可以:

public functionGetPagedListSizeAttribute()
{
    return #some evaluation;
}

protected $appends = array('pagedListSize');

这样,pagedListSize不仅可以直接作为字段使用,而且只要模型为serialized作为Json或数组,它就可用。