我有一个视图,我试图重用两个不同的操作来显示数据库中的数据。对于其中一个操作,将Eloquent集合对象传递给视图,并使用
检索数据。@foreach($buildings as $key=>$value)
{!! $value->build_name !!}
显然'build_name'是表中的一列。到目前为止很简单…
现在我需要这个相同的视图来显示需要大量处理的数据,并且不可能生成一个有说服力的语句来传递给视图。
为了重用$value->build_name
代码,我假设我仍然必须传递一个对象(模型??)给视图。
我有一个Building.php模型
class Building extends Model
{
protected $fillable =[
'buildingtype_id',
'build_name',
];
,我想我可以把public $build_name;
添加到建筑模型,但我也应该添加一个方法来设置和获得$build_name。所以我的建筑模型现在看起来像…
class Building extends Model
{
public $build_name;
protected $fillable =[
'buildingtype_id',
'build_name',
];
public function getBuildName () {
return $this->build_name;
}
public function setBuildName ($name) {
$this->build_name = $name;
}
我可以自己在控制器中创建对象。
如果我这样做,{!! $value->build_name !!}
仍然适合该视图吗?或者我现在应该使用{!! $value->getBuildName() !!}
或者我错过了一个关键概念?我对Laravel和OOP还是个新手。
编辑我刚刚实现了这个,但它不起作用。如果我将public $build_name
属性添加到模型中,getBuildName不返回任何东西,但是如果我删除public $build_name
,它会……(这将打破我试图手动创建该对象)
当您声明public $build_name
时,这将覆盖(或者更准确地说,重置)模型中具有相同名称的任何其他字段。因此,在获取它之前,您必须调用setBuildName()
setter方法。
我刚刚实现了这个,它不工作。如果我添加公共
$build_name
属性到模型,getBuildName不返回任何东西
这是因为您在setter方法之前调用了getter方法,所以在公共变量$build_name
中没有设置任何(null
)。
虽然你还没有完全提到为什么你想重用Eloquent模型,但是你可以通过对模型的setter方法做一点调整来达到你想要的目的:
class Building extends Model
{
/* ... */
public function setBuildName ($name) {
$this->build_name = $name;
return $this;
}
}
注意返回当前对象($this
),以防您想一次链接多个setter方法。
例如:
$model->setBuildName('some name')->setBuildHeight(400);
更新您可以使用默认的雄辩模型来达到您的目的(因此,您不必创建一个复制的类来达到大致相同的效果)。现在假设你有你的模型Building
,并想要手动设置它的属性,那么,对模型的以下操作仍然是合适的:
$building = new App'Building();
$building->build_name = 'Some Building Name'; // you can substitute this with your setter method as well
$building->build_height = 110; // assuming you have a column named `build_height` in your model's table
注意你在这里所做的唯一的区别是:
- 你不要在Eloquent模型中声明公共变量你不能在模型上调用Eloquent的
save()
方法来持久化手动设置的数据(给它一个瞬态行为)。
模型现在完全可以传递给你的视图,你可以像使用常规模型一样访问它的属性:
<!-- in your view -->
{{ $building->build_name }}
{{ $building->build_height }}
作为设置任意数据的另一种方法,你可以有一个单一的setter,它接受一个数组键值数据存储在模型中(例如['build_name' => 'Building Name', 'build_height' => 110]
):
//in class Building
public function setData($data){
$this->build_name = $data['build_name'];
$this->build_height = $data['build_height'];
}