Laravel从可重用视图

时间:2015-10-11 01:42:38

标签: php laravel laravel-5

我认为我试图重复使用两种不同的操作来显示数据库中的数据。对于其中一个操作,将 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它会...(这会破坏我尝试手动创建该对象)

1 个答案:

答案 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

请注意,您在此处所做的唯一区别是:

  1. 根本不会在Eloquent模型中声明公共变量。
  2. 您不会在模型上调用Eloquent的save()方法,以持久手动设置数据(为其提供瞬态行为)。
  3. 该模型现在完全有资格传递到您的视图,您可以像使用常规模型一样访问它的属性:

    <!-- 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'];
    }