2015-09-30 2 views
0

Я пытаюсь получить доступ к свойствам пользовательского объекта в PHP:Доступ к свойствам объекта в PHP

<?php 

namespace App\Classes; 

use Illuminate\Database\Eloquent\Model; 

class AED extends Model { 

    protected $table = 'aeds'; 
    protected $fillable = ['owner', 'street', 'postal_code', 'locality', 'latitude', 'longitude', 'annotation_type']; 
    public $timestamps = true; 

    public $id; 
    public $owner; 
    public $object; 
    public $street; 
    public $postalCode; 
    public $locality; 
    public $latitude; 
    public $longitude; 
    public $annotation_type; 
    public $distance; 

    public function set($data) { 
     foreach ($data as $key => $value) { 
      if(property_exists($this, $key)) { 
       $this->$key = $value; 
      } 
     } 
    } 
} 

Код для доступа к этим свойствам:

<?php 
namespace App\Transformer; 

use App\Classes\AED; 
use League\Fractal\TransformerAbstract; 


class AEDTransformer extends TransformerAbstract { 
    public function transform(AED $aed) { 
     return [ 
      'data' => $aed->owner 
     ]; 
    } 
} 

Когда я вызываю функцию, я получаю это как ответ:

{ 
data: [ 
{ 
data: null 
} 
], 
meta: "TestMeta" 
} 

странная вещь, когда я только var_dump объекта я получаю полную информацию:

... 
protected 'original' => 
    array (size=11) 
     'id' => int 1 
     'owner' => string 'Owner 1' (length=7) 
     'object' => string 'Object 1' (length=8) 
     'street' => string 'Street 1' (length=8) 
     'postal_code' => string '11111' (length=5) 
     'locality' => string 'Locality 1' (length=10) 
     'latitude' => float 100 
     'longitude' => float 100 
     'annotation_type' => string '1' (length=1) 
     'created_at' => string '0000-00-00 00:00:00' (length=19) 
     'updated_at' => string '0000-00-00 00:00:00' (length=19) 
... 

Таким образом, данные могут быть взяты из базы данных, как ожидалось, и также принимаются. Почему тогда доступ не работает, и я получаю «нуль».

Я использую «установить» метод внутри пользовательской функции здесь:

class AEDHelper { 
    static public function searchAED($position) { 
     $var1 = $position['latitude']; 
     $var2 = $position['longitude']; 
     $var3 = $position['latitude']; 

     $queryResults = DB::select(DB::raw("SQLCODE")); 
     $results = []; 

     foreach ($queryResults as $results) { 
      $aed = new AED(); 
      $aed->set($results); 
      $results[] = $aed; 
     } 

     return $results; 

    } 

Здесь я создаю новый экземпляр AED(). Поэтому я предполагаю, что мне нужно определить свойства объекта, так как теперь не будет использоваться Eloquent, но для отображения результатов SQL должен быть создан пользовательский класс AED.

+1

Вам не нужно определять поля в вашей модели. Eloquent делает их доступными динамически. –

+0

Я удалил поля и теперь это работает. но что, если мне понадобятся поля позже, чтобы получить к ним доступ? Как правильно их заполнить? – sesc360

ответ

0

Вы не должны определять поля в своей модели. Eloquent делает их доступными динамически.

Если вы хотите заполнить эти поля, вы можете без них в своей модели. потому что поле будет доступно, если вы попытаетесь установить для него значение.

вот как

$aed = new AED; 
$aed->owner = "The Owner"; 
$aed->object = "The Object"; 
.... 
.... 
.... 

$aed->save(); 

или это будет работать, а

AED::create([ 
    'owner' => "The Owner", 
    'object' => "The Object", 
    ..... 
    ..... 
    ..... 
]); 

или если вы хотите обновить существующую модель.

$aed = AED::find(1); 
// change owner 
$aed->owner= "New Owner"; 

$aed->save(); 
+0

Но почему мой объект не заполнен данными в приведенном выше примере, где я вставил свойства в свой пользовательский класс, а вывод «null», тогда как когда я вызываю сам объект и возвращаю его, я вижу существующие значения. Итак, я полагаю, что свойства объекта не заданы? – sesc360

+0

, где вы вызываете метод '' AED :: set() '' –

+0

Только что обновил мой вопрос. Я использую этот метод для создания экземпляров AED, когда получаю пользовательские результаты запроса БД и хочу установить каждый из них с помощью класса AED. Значит, мне нужно определение свойств? – sesc360

Смежные вопросы