#php #laravel
#php #laravel
Вопрос:
Я уже прочитал другие подобные вопросы по stackoverflow, и ни один из них не помог мне найти решение.
Это совершенно запутано, то, что когда-то работало, случайно сломалось, и я понятия не имею, что не так, ошибка не кажется мне логичной, я покажу вам, что я имею в виду.
public function nGetOverviewAccounts()
{
$results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();
$index = 0;
$accounts = [];
foreach($results as $result)
{
$accountType = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
$statusType = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();
return $accountType[0]['name']; //this works
$accounts[$index]['account_type'] = $accountType[0]['name']; //this doesnt..
$accounts[$index]['status_type'] = $statusType[0]['name'];
$index ;
}
return $accounts;
}
Этот код находится рядом друг с другом в функции. Массив $accountType
выглядит следующим образом.
0:{name: "Google"}
Который показывает, что он имеет индекс 0, но он не работает.
РЕДАКТИРОВАТЬ: ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ
Я собираюсь кое-что прояснить, я, кажется, неправильно объяснил вам, ребята, оператор return добавлен мной ПОСЛЕ того, как я получаю ошибку undefined index, я только добавил его в код, чтобы показать, что он работает, когда я возвращаю его, но когда я пытаюсь присвоить его значение другой переменной (без оператора return) я получаю ошибку неопределенного индекса.
Комментарии:
1. Такова природа функции, обрабатывающей возвращаемое значение. Как только вы возвращаете значение, функция «останавливается» сама по себе, что означает, что каждый цикл или каждый код ПОСЛЕ первого возврата, с которым сталкивается функция, не будут выполняться. Вот почему у вас есть только 1 строка вместо n.
2. Почему вы
[0]
все равно используете. Похоже, что этот вызов в любом случае вернет только одну строку, поэтому используйте$accountType['name']
3. В любом случае, поскольку строка, о которой вы говорите, не работает, после a
return
она на самом деле никогда не будет выполнена4. @RiggsFolly Я могу удалить оператор return из кода, и он выполнит следующую строку, вот как я получал ошибку в первую очередь. Возврат был введен для тестирования кода.
5. @kenzieeflavius используйте
print_r()
вместоreturn
, чтобы увидеть значение.
Ответ №1:
Попробуйте это:
public function nGetOverviewAccounts()
{
$results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();
$accounts = [];
foreach($results as $key => $result)
{
$accountType = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
$statusType = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();
if(!empty( $accountType[0]['name'])) amp;amp; !empty( $statusType[0]['name'])){
$accounts[$key]['account_type'] = $accountType[0]['name']; //this doesnt..
$accounts[$key]['status_type'] = $statusType[0]['name'];
}
}
return $accounts;
}
Также, если вам нужен первый ключ $accountType
, а $statusType
затем вы можете использовать first()
вместо get()
. Если ваши ключи отличаются, вы можете использовать $index
Комментарии:
1. Проблема не
$results
в его с$accountType[0]
2. В вашем
foreach
цикле, который вы использовалиreturn $accountType[0]['name'];
, и, следовательно, значение возвращается и никогда не помещается внутрь массива.3. Вы меня неправильно поняли, я не пытаюсь увидеть, что в массиве, который я уже знаю, я использую return, чтобы посмотреть, выдаст ли он ошибку, но это не так. Когда я не использую оператор return, следующая строка ниже выдает ошибку, эта ошибка «неопределенный индекс 0», вот вопрос, извините, если он ошибся
4. @Kenzieeflavius Итак, в этом случае ваша
$accountsType
переменная возвращает значение null. Я обновляю код для этого.5. Он не возвращает значение null, в моем вопросе это показывает, что когда я возвращаю переменную, она дает мне объект данных, который мне нужен, НО когда я назначаю его, он указывает неопределенное смещение
Ответ №2:
Добавление некоторых проверок никому не повредит:
public function nGetOverviewAccounts() {
$results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();
$index = 0;
$accounts = [];
foreach($results as $result)
{
$accountType = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
$statusType = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();
$accounts[$index]['account_type'] = (isset($accountType[0]) amp;amp; isset($accountType[0]['name'])?$accountType[0]['name']:"Unknown";
$accounts[$index]['status_type'] = (isset($statusType[0]) amp;amp; isset($statusType[0]['name'])?$statusType[0]['name']:"Unknown";
$index ;
}
return $accounts;
}
Проблема в том, что ваш «отладочный» код проверяется только в том случае, если он работал для 1-й итерации цикла, возможно, он все еще не работал для N-го элемента.
Однако, если это решит вашу проблему, следующий вопрос: почему существуют учетные записи, связанные с недопустимыми идентификаторами типа учетной записи. Это может быть признаком более серьезной проблемы.
Комментарии:
1. Причина, по которой он был связан с недопустимыми идентификаторами, заключается в том, что исходный тип учетной записи был назначен нескольким учетным записям. Но он был удален из базы данных, но затем добавлен повторно, но с другим идентификатором. Поскольку он использует идентификатор для проверки и отображения данных, а не имя, оно выдавало ошибку, где, где вы 30 минут назад!