我认为我试图重复使用两种不同的操作来显示数据库中的数据。对于其中一个操作,将 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;
添加到Building模型中,但我还应该添加一个方法来设置和获取$ 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
它会...(这会破坏我尝试手动创建该对象)
答案 0 :(得分:1)
当您声明public $build_name
时,这将覆盖(或更确切地说,重置)模型中具有相同名称的任何其他字段。因此,您必须在获取之前调用setBuildName()
setter方法。
我刚刚实现了这个,但它没有用。如果我将公共
$build_name
属性添加到模型中,则getBuildName不会返回任何内容
那是因为你在setter之前调用了getter方法,因此在公共变量null
中没有设置任何内容($build_name
)。
虽然你还没有完全提到为什么你想要重复使用Eloquent模型,但你可以通过对模型的setter方法进行一些调整来实现你想要的目的:
class Building extends Model
{
/* ... */
public function setBuildName ($name) {
$this->build_name = $name;
return $this;
}
}
注意返回当前对象($this
),以防您想要一次链接多个setter方法。
e.g:
$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
请注意,您在此处所做的唯一区别是:
save()
方法,以持久手动设置数据(为其提供瞬态行为)。该模型现在完全有资格传递到您的视图,您可以像使用常规模型一样访问它的属性:
<!-- in your view -->
{{ $building->build_name }}
{{ $building->build_height }}
作为设置任意数据的另一种方法,您可以使用单个setter接受要存储在模型中的键值数据的数组(例如['build_name' => 'Building Name', 'build_height' => 110]
):< / p>
//in class Building
public function setData($data){
$this->build_name = $data['build_name'];
$this->build_height = $data['build_height'];
}