2015-10-29 2 views
0

Я новичок в Laravel и на данный момент у меня есть кусок кода в контроллере, который без цикла while работает, он извлекает мой запрос из базы данных.Laravel и while Loop

public function dash($id, Request $request) { 
     $user = JWTAuth::parseToken()->authenticate(); 
     $postdata = $request->except('token'); 

     $q = DB::select('SELECT * FROM maps WHERE user_id = :id', ['id' => $id]); 

     if($q->num_rows > 0){ 
      $check = true; 

      $maps = array(); 
      while($row = mysqli_fetch_array($q)) { 
       $product = array(
        'auth' => 1, 
        'id' => $row['id'], 
        'url' => $row['url'], 
        'locationData' => json_decode($row['locationData']), 
        'userData' => json_decode($row['userData']), 
        'visible' => $row['visible'], 
        'thedate' => $row['thedate'] 
       ); 
       array_push($maps, $product); 
      } 
     } else { 
      $check = false; 
     } 

     return response()->json($maps); 
    } 

Я пытаюсь Переберите возвращаемые данные из $q и использовать json_decode на 2 ключевых пар/VAL, но я даже не могу получить это сделано правильно.

ответ

1

Не используйте mysqli для проведения итерации по результатам (Laravel doesn't use mysqli). Результаты возвращаются из Laravel-х query builder являются Traversable, так что вы можете просто использовать цикл Еогеасп:

$q = DB::select('...'); 
foreach($q as $row) { 
    // ... 
} 

Каждый $row будет объект, а не массив:

$product = array(
    'auth' => 1, 
    'id' => $row->id, 
    'url' => $row->url, 
    'locationData' => json_decode($row->locationData), 
    'userData' => json_decode($row->userData), 
    'visible' => $row->visible, 
    'thedate' => $row->thedate 
); 
2
  1. Вы не используете $postdata в этой функции, поэтому удалите его.
  2. Не используйте mysqli в Laravel. Use models and/or the DB query functionality built in.
  3. Вы - passing the wrong thing to mysqli_fetch_array. Он всегда возвращает неверное значение, поэтому цикл никогда не заканчивается.
  4. Почему вы перебираете данные строки? Просто верните результаты запроса - они уже представляют собой массив. Если вы хотите, чтобы такие вещи, как 'locationData' и 'userData', были расшифрованы JSON, затем используйте модель с методами для этого. Помните, что с MVC вы всегда должны помещать какие-либо данные в модели.

Так лучший способ сделать это с Laravel models and relationships:

// put this with the rest of your models 
// User.php 
class User extends Model 
{ 
    function maps() 
    { 
     return $this->hasMany ('App\Map'); 
    } 
} 

// Maps.php 
class Map extends Model 
{ 
    // you're not using this right now, but in case your view needs to get 
    // this stuff you can use these functions 
    function getLocationData() 
    { 
     return json_decode ($this->locationData); 
    } 

    function getUserData() 
    { 
     return json_decode ($this->userData); 
    } 
} 

// now in your controller: 
public function dash ($id, Request $request) { 
    // $user should now be an instance of the User model 
    $user = JWTAuth::parseToken()->authenticate(); 

    // don't use raw SQL if at all possible 
    //$q = DB::select('SELECT * FROM maps WHERE user_id = :id', ['id' => $id]); 
    // notice that User has a relationship to Maps defined! 
    // and it's a has-many relationship so maps() returns an array 
    // of Map models 
    $maps = $user->maps(); 

    return response()->json($maps); 
} 
+0

+1 надеюсь, не NIT собирание здесь, но я бы назвал модель 'Map' как каждый экземпляр представляет только 1 строку. – AbstractChaos

+1

Я делал это, но потом обнаружил, что я часто делаю такие вещи, как «Карты :: где» («foo», «bar») -> get(); », и поэтому для кода, который я писал, это имело смысл чтобы сохранить его во множественном числе, поскольку эта модель отвечает за ВСЕ карты, то есть за таблицу карт. Хотя у вас определенно есть точка. Я думаю, это зависит от стиля типичного использования. – erapert