Laravel - 使用通过Ajax传递的数组时没有模型的查询结果

时间:2017-12-11 03:58:50

标签: php arrays ajax laravel

我收到了错误;

  

模型[App \ UserProfile] 0

没有查询结果

当我使用在foreach循环中使用AJAX传递的数组时使用findOrFail。如果我在PHP中手动创建数组,则使用数组值找到实体。当我在PHP中对数组执行print_r()时,该数组存在于AJAX数组和手动创建的数组中。

AJAX代码

function checkChatOnlineStatus()
{
    var chatUserProfileIds = {"key-60":60,"key-52":52,"key-2":2,"key-3":3}

    $.ajax({
        url: '/check-chat-online-status',
        method: 'get',
        data: {chatUserProfileIds: chatUserProfileIds},
        dataType: 'json',
        success: function(response) {

        }
    });
}

PHP代码

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\UserProfile;

class CheckRunningParametersController extends Controller
{
    public function checkChatOnlineStatus()
    {
        $chatUserProfileIds = $_GET['chatUserProfileIds'] ? $_GET['chatUserProfileIds'] : NULL;
        //$chatUserProfileIds = array('key-60' => 60, 'key-52' => 52, 'key-2' => 2, 'key-3' => 3);

        /* Check Status For Chat Contacts */
        if ($chatUserProfileIds != NULL)
        {
            foreach ($chatUserProfileIds as $key => $value)
            {


                $userProfile = UserProfile::findOrFail((int)$value);

                $chatOnlineStatus['contacts'][$key] = $userProfile->isOnline();

            }
        }

        return $chatOnlineStatus;
    }
}

5 个答案:

答案 0 :(得分:0)

如果没有带有该id的UserProfile,则使用findOrFail()将抛出异常。您可能正在将ID号推回到Laravel的不存在的数据库中。如果您不想要异常并希望自行检查,请使用first()或find(),然后执行if检查isset以查看是否返回了模型,如果ID没有&#39则执行空值; t匹配UserProfile。 IE:

$userProfile = UserProfile::find((int)$value);
if(isset($userProfile)
    $chatOnlineStatus['contacts'][$key] = $userProfile->isOnline();

如果您确定UserProfile存在您传递的ID,则可能是错误地将字符串强制转换为int的问题。检查以确切通过dd()传递什么(int)。您可能还希望使用原生Laravel \ Input :: get(&#39; chatUserProfileIds&#39;)而不是$ _GET。

答案 1 :(得分:0)

这里您的PHP代码将是这样的

<?php

 namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\UserProfile;

class CheckRunningParametersController extends Controller
{
    public function checkChatOnlineStatus()
    {
      $chatUserProfileIds = $_GET['chatUserProfileIds'];

      /* Check Status For Chat Contacts */
      if ($chatUserProfileIds != NULL)
      {
        foreach ($chatUserProfileIds as $key => $value)
        {
            $userProfile = UserProfile::where("id",(int)$value)->first();

            $chatOnlineStatus['contacts'][$key] = $userProfile->isOnline();
        }
      }
      return $chatOnlineStatus;
    }
}

答案 2 :(得分:0)

  1. 试试这个简单的代码

    if($ chatUserProfileIds){

    $ userProfile = UserProfile :: whereIn(“id”,array_values($ chatUserProfileIds)) - &gt; get();

    }

    • 并迭代结果并填充在线状态等并返回结果。

答案 3 :(得分:0)

@Muhammad Sadiq

我试过了;

if( $chatUserProfileIds != NULL ){
    $userProfiles = UserProfile::whereIn("id",array_values($chatUserProfileIds))->get();

    foreach ($userProfiles as $userProfile)
    {
        //print_r($userProfile->id);
        $chatOnlineStatus['contacts'][$userProfile->id] = $userProfile->isOnline();
    }
}

代码仅在我删除print_r语句的注释或在此时添加任何其他语句如echo时才有效

答案 4 :(得分:0)

我发现了问题。真的很傻。我将数据的分配移动到数组中使用的JavaScript对象到全局范围,这似乎有效。

// Moved this to global scope in the Javascript
var chatUserProfileIds = {"key-60":60,"key-52":52,"key-2":2,"key-3":3}