Laravel从可重用视图访问集合属性和模型属性


Laravel accessing collection attributes and model attributes from reusable view

我有一个视图,我试图重用两个不同的操作来显示数据库中的数据。对于其中一个操作,将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

注意你在这里所做的唯一的区别是:

  1. 不要在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'];
}