Как выполнить итерацию по объекту eloquent, который имеет несколько записей?

#laravel #laravel-5.3

#laravel #laravel-5.3

Вопрос:

Я использую следующий код для извлечения записей из таблицы:

 namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateDatabaseEloquentCollection;
use AppHttpRequests;
//use ApptempLogin;

class loginController extends Controller
{
    public function checkCredentials(Request $request){

        $mobile = $request->mobile;

        $users = ApptempLogin::where('mobile','=',$mobile)->get();


        return $user->name;

    }
  

Но это объект eloquent, поэтому он выдает мне ошибку. каким будет другой способ сделать это?

Комментарии:

1. какое сообщение об ошибке?

2. Я просто возвращаю Var_dump ($users), поэтому я получил вывод, подобный object.

3. вы говорите «это выдает мне ошибку»?

4. $user не определено, но $users является

Ответ №1:

У вас опечатка

 $users = ApptempLogin::where('mobile','=',$mobile)->get();//you are getting $users
  

amp; возврат

 return $user->name;
  

Поэтому измените его на

 return $users->name;
  

Но я все еще сомневаюсь, что это решит вашу проблему, поскольку вы используете get amp; get возвращает a collection , если у вас нет отношения в tempLogin модели.

Итак, я предполагаю, что у вас есть запись в БД, которая mobile чему-то равна, и вы хотите вернуть ее имя, если это так, то вы можете использовать это решение

 $users = ApptempLogin::where('mobile','=',$mobile)->firstOrFail();//source https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Builder.php#L299-L306
  

затем верните

 return $users->name;
  

Если у вас есть несколько записей в БД и вы хотите сделать a get ,
вы можете сделать это следующим образом

 $users = ApptempLogin::select(['name'])->where('mobile','=',$mobile)->get();
  

Это будет выбирать только name из таблицы

Теперь вы можете вернуть

 return $users;
  

Который будет представлять собой коллекцию tempLogin Model amp;, если вы используете его в качестве api, он будет автоматически кодироваться в формате JSON с использованием запроса laravel следующим образом

 [{"name":'YOUR_NAME_OF_THE_RECORD'},{"name":'YOUR_NAME_OF_THE_RECORD'}]
  

Или, если вы хотите вернуть запись в виде массива, вы можете использовать это следующим образом

 $users = ApptempLogin::select(['name'])->where('mobile','=',$mobile)->pluck('name')->all();
return $users;
  

Это вернет массив, подобный этому

 [
 "YOUR_NAME_OF_THE_RECORD",
 "YOUR_NAME_OF_THE_RECORD",
]You have a typo

$users = ApptempLogin::where('mobile','=',$mobile)->get();//you are getting $users
  

amp; возврат

 return $user->name;
  

Поэтому измените его на

 return $users->name;
  

Но я все еще сомневаюсь, что это решит вашу проблему, поскольку вы используете get amp; get возвращает a collection , если у вас нет отношения в tempLogin модели.

Итак, я предполагаю, что у вас есть запись в БД, которая mobile чему-то равна, и вы хотите вернуть ее имя, если это так, то вы можете использовать это решение

 $users = ApptempLogin::where('mobile','=',$mobile)->firstOrFail();//source https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Builder.php#L299-L306
  

затем верните

 return $users->name;
  

Если у вас есть несколько записей в БД и вы хотите сделать a get ,
вы можете сделать это следующим образом

 $users = ApptempLogin::select(['name'])->where('mobile','=',$mobile)->get();
  

Это будет выбирать только name из таблицы

Теперь вы можете вернуть

 return $users;
  

Который будет представлять собой коллекцию tempLogin Model amp;, если вы используете его в качестве api, он будет автоматически кодироваться в формате JSON с использованием запроса laravel следующим образом

 [{"name":'YOUR_NAME_OF_THE_RECORD'},{"name":'YOUR_NAME_OF_THE_RECORD'}]
  

Или, если вы хотите вернуть запись в виде массива, вы можете использовать это следующим образом

 $users = ApptempLogin::select(['name'])->where('mobile','=',$mobile)->pluck('name')->all();
return $users;
  

Это вернет массив, подобный этому

 [
 "YOUR_NAME_OF_THE_RECORD",
 "YOUR_NAME_OF_THE_RECORD",
]
  

Комментарии:

1. но у меня нет дубликата мобильного телефона. в БД, поэтому он будет извлекать несколько записей, и именно поэтому я хочу перебирать $users.

2. это не сработает, потому что ->get() вернет коллекцию. не модель. вам нужно выполнить итерацию или использовать индексированный доступ, чтобы получить свойство модели.

3. Но в документации указано, что мы можем перебирать коллекцию.

4. @ARIF… Я изменил что-то вроде этого: $users = tempLogin::where(‘mobile’,’=’,$mobile)-> get(); Могу ли я теперь получить доступ к именам??

5. Нет, вы не можете, потому что это collection amp; вы хотите получить доступ к свойству модели, которая находится внутри коллекции, вы можете получить доступ к name, только если это экземпляр модели

Ответ №2:

Вы пытаетесь использовать $user переменную, которая не определена. Вы должны выполнить итерацию по коллекции, чтобы получить одного пользователя:

 foreach ($users as $user) {
    echo $user->name;
}
  

Ответ №3:

Обычно вы перебираете элементы коллекции следующим образом:

 $users = ApptempLogin::where('mobile','=',$mobile)->get();

if($users->count() > 0)
{
   forach($users as $user)
   {
      // do something with the AppUser model
      $name = $user->name;
   }
}
  

но если вы хотите получить доступ к коллекции users в виде массива, измените запрос следующим образом:

 $users = ApptempLogin::where('mobile','=',$mobile)->toArray();
  

затем вы можете получить к нему доступ следующим образом:

 foreach($users as $user)
{
    // now the $user contains an array containing each row data.
    $name = $user["name"];
}
  

если вы хотите получить доступ к одному пользователю:

 $user = ApptempLogin::where('mobile','=',$mobile)->first();
$name = $user->name;
  

это приведет к получению первой (смещение 0, ограничение 1) строки для вас. Вам нужно указать порядок, чтобы получить желаемую первую строку.

Комментарии:

1. Я изменил его следующим образом: $mobile = $request-> mobile; $users = tempLogin::where(‘mobile’,’=’,$mobile) -> toArray(); вернуть $users;