2015-05-27 3 views
0

Я пытаюсь получить доступ к коллекции и создать новый объект, используя часть результатов.Не удается получить доступ к свойствам коллекции Lavavel в Loop

Я продолжаю получать это Undefined offset: 0, и я не могу обойти его.

Вот моя петля foreach в моем контроллере;

foreach($payments as $payment_key => $payment_value) { 

     //payment_value['Vendor ZIP'] will be something like "SW1A1AA" 
     $partial_vendor_zip = trim_and_convert($payment_value['Vendor ZIP'], 0, -3); 

     //$partial_vendor_zip will be something like "SW1A"   
     //SQL is something like SELECT * FROM postcode_coord WHERE postcode = 'SW1A' LIMIT 1; 
     $postcode_coord = PostcodeCoord::where('postcode', '=', $partial_vendor_zip)->take(1)->get(); 

     print $postcode_coord['0']->lat; //causes error; Undefined offset: 0 

     $markers[] = (object)[ 
      "postcode" => $postcode_coord->postcode, 
      "payment_name" => $payment_value['Contract Title'], 
      "full_postcode" => $payment_value['Vendor ZIP'], 
      "lat" => $postcode_coord->lat, 
      "lng" => $postcode_coord->lng, 
     ]; 

    } 

Интересно, что я все еще могу получить отпечаток всех «лат», но также получаю ошибку. Если я заменю это только print_r($postcode_coord);, то вот образец моей коллекции;

Illuminate\Database\Eloquent\Collection Object 
(
[items:protected] => Array 
    (
     [0] => App\Models\PostcodeCoord Object 
      (
       [connection:protected] => 
       [table:protected] => 
       [primaryKey:protected] => id 
       [perPage:protected] => 15 
       [incrementing] => 1 
       [timestamps] => 1 
       [attributes:protected] => Array 
        (
         [id] => 429 
         [postcode] => CF11 
         [lat] => 51.47 
         [lng] => -3.20 
         [created_at] => 2015-02-20 13:07:01 
         [updated_at] => 2015-02-20 13:07:01 
        ) 

       [original:protected] => Array 
        (
         [id] => 429 
         [postcode] => CF11 
         [lat] => 51.47 
         [lng] => -3.20 
         [created_at] => 2015-02-20 13:07:01 
         [updated_at] => 2015-02-20 13:07:01 
        ) 

       [relations:protected] => Array 
        (
        ) 

       [hidden:protected] => Array 
        (
        ) 

       [visible:protected] => Array 
        (
        ) 

       [appends:protected] => Array 
        (
        ) 

       [fillable:protected] => Array 
        (
        ) 

       [guarded:protected] => Array 
        (
         [0] => * 
        ) 

       [dates:protected] => Array 
        (
        ) 

       [casts:protected] => Array 
        (
        ) 

       [touches:protected] => Array 
        (
        ) 

       [observables:protected] => Array 
        (
        ) 

       [with:protected] => Array 
        (
        ) 

       [morphClass:protected] => 
       [exists] => 1 
      ) 

    ) 

) 

Так что работает! Но я не могу ссылаться на атрибуты. Даже когда я пытаюсь изменить свой запрос на что-то вроде;

$postcode_coord = PostcodeCoord::where('postcode', '=', $partial_vendor_zip)->take(1)->toArray(); 

И это просто дает мне неопределенную ошибку метода.

Laravel очень запутанным мне ...

+0

Что происходит при печати $ postcode_coord-> lat; ? (без ['0']) – retrograde

+0

Я получаю неопределенную ошибку свойства для $ lat – mikelovelyuk

+1

Я не использовал take (1) -> get() раньше, но кроме этого все выглядит хорошо для меня. Возможно, попробуйте выполнить sub take (1) -> get() с -> first(), а затем попробуйте dd ($ postcode_coord-> lat); – retrograde

ответ

2

Вы должны сделать это так:

$postcode_coord = PostcodeCoord::where('postcode', '=', $partial_vendor_zip)->first(); 

print $postcode_coord->lat; 

$markers[] = (object)[ 
    "postcode" => $postcode_coord->postcode, 
    "payment_name" => $payment_value['Contract Title'], 
    "full_postcode" => $payment_value['Vendor ZIP'], 
    "lat" => $postcode_coord->lat, 
    "lng" => $postcode_coord->lng, 
]; 

Обратите внимание на использование first() вместо take(1)->get(), так как последний будет возвращать сбор и бывший возвращает один элемент.

Если вы действительно хотите использовать take(1)->get(), то вы должны сделать это следующим образом:

$postcode_coord = PostcodeCoord::where('postcode', '=', $partial_vendor_zip)->take(1)->get(); 

print $postcode_coord[0]->lat; 

$markers[] = (object)[ 
    "postcode" => $postcode_coord[0]->postcode, 
    "payment_name" => $payment_value['Contract Title'], 
    "full_postcode" => $payment_value['Vendor ZIP'], 
    "lat" => $postcode_coord[0]->lat, 
    "lng" => $postcode_coord[0]->lng, 
]; 

Примечание Здесь использование 0 вместо '0' и что этот показатель также используется в последующих ссылках на $postcode_coord.

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

  • Нет связанных вопросов^_^