Я пытаюсь получить свойство $seen->seen внутри цикла for-each, но получаю:
"Попытка прочитать свойство "увидено" с нулевым значением"
Когда я делаю это вне цикла for-each, все работает нормально
public function getromes(Request $request)
{
$user = Auth::id();
$romes = Rome::where('room', $request->id)->get();
$romeids = $romes->pluck('uuid');
// $seen = Seen::where('message', 'IcHshOP2V')
// ->where('user', $user)
// ->first();
// $wasseen = $seen->seen;
foreach ($romeids as $uuid) {
$seen = Seen::where('message', $uuid)
->where('user', $user)
->first();
$wasseen = $seen->seen;
if ($seen->seen === 0) {
$seen->seen = 1;
$seen->seen_at = Carbon::now();
$seen->save();
}
}
return response()->json([
'message' => 'Getting posts was successful',
'romes' => $romes,
'wasseen' => $wasseen
], 200);
}
class Rome extends Model
{
use HasFactory;
protected $fillable = [
'sender',
'room',
'msgtext',
'uuid',
'edited',
'files',
'images',
'seen'
];
}
class Seen extends Model
{
use HasFactory;
protected $fillable = [
'message',
'user',
'seen',
'seen_at'
];
}
*> var_dump($seen) inside for-each loop looks like this*
> object(Illuminate\Database\Eloquent\Collection)#309 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#310 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#1048 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#313 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#315 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#314 (2) {
> ["items":protected]=> array(0) { }
> ["escapeWhenCastingToString":protected]=> bool(false) }
> object(Illuminate\Database\Eloquent\Collection)#1274 (2) {
> ["items":protected]=> array(1) {
> [0]=>
> object(App\Models\Seen)#1275 (30) {
> ["connection":protected]=>
> string(5) "mysql"
> ["table":protected]=>
> string(5) "seens"
> ["primaryKey":protected]=>
> string(2) "id"
> ["keyType":protected]=>
> string(3) "int"
> ["incrementing"]=>
> bool(true)
> ["with":protected]=>
> array(0) {
> }
> ["withCount":protected]=>
> array(0) {
> }
> ["preventsLazyLoading"]=>
> bool(false)
> ["perPage":protected]=>
> int(15)
> ["exists"]=>
> bool(true)
> ["wasRecentlyCreated"]=>
> bool(false)
> ["escapeWhenCastingToString":protected]=>
> bool(false)
> ["attributes":protected]=>
> array(7) {
> ["id"]=>
> int(3)
> ["message"]=>
> string(9) "IcHshOP2V"
> ["user"]=>
> string(1) "3"
> ["seen"]=>
> int(0)
> ["seen_at"]=>
> string(1) "0"
> ["created_at"]=>
> string(19) "2023-03-30 15:18:59"
> ["updated_at"]=>
> string(19) "2023-03-30 15:18:59"
> }
> ["original":protected]=>
> array(7) {
> ["id"]=>
> int(3)
> ["message"]=>
> string(9) "IcHshOP2V"
> ["user"]=>
> string(1) "3"
> ["seen"]=>
> int(0)
> ["seen_at"]=>
> string(1) "0"
> ["created_at"]=>
> string(19) "2023-03-30 15:18:59"
> ["updated_at"]=>
> string(19) "2023-03-30 15:18:59"
> }
> ["changes":protected]=>
> array(0) {
> }
> ["casts":protected]=>
> array(0) {
> }
> ["classCastCache":protected]=>
> array(0) {
> }
> ["attributeCastCache":protected]=>
> array(0) {
> }
> ["dates":protected]=>
> array(0) {
> }
> ["dateFormat":protected]=>
> NULL
> ["appends":protected]=>
> array(0) {
> }
> ["dispatchesEvents":protected]=>
> array(0) {
> }
> ["observables":protected]=>
> array(0) {
> }
> ["relations":protected]=>
> array(0) {
> }
> ["touches":protected]=>
> array(0) {
> }
> ["timestamps"]=>
> bool(true)
> ["hidden":protected]=>
> array(0) {
> }
> ["visible":protected]=>
> array(0) {
> }
> ["fillable":protected]=>
> array(4) {
> [0]=>
> string(7) "message"
> [1]=>
> string(4) "user"
> [2]=>
> string(4) "seen"
> [3]=>
> string(7) "seen_at"
> }
> ["guarded":protected]=>
> array(1) {
> [0]=>
> string(1) "*"
> }
> } } ["escapeWhenCastingToString":protected]=> bool(false) } {"message":"Getting posts was
> successful","romes":[{"id":1,"sender":7,"room":"1","msgtext":"agfdasfasdf","uuid":"2tAwioIIu","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:00:40.000000Z","updated_at":"2023-03-30T15:00:40.000000Z"},{"id":2,"sender":3,"room":"1","msgtext":"sdfgfdsg","uuid":"ic91IRrqX","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:00:43.000000Z","updated_at":"2023-03-30T15:00:43.000000Z"},{"id":3,"sender":5,"room":"1","msgtext":"zxcvxcv","uuid":"x5qXAtRot","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:01:56.000000Z","updated_at":"2023-03-30T15:01:56.000000Z"},{"id":4,"sender":3,"room":"1","msgtext":"fsadfasdfasdf","uuid":"MJD6jjfBU","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:13:34.000000Z","updated_at":"2023-03-30T15:13:34.000000Z"},{"id":5,"sender":3,"room":"1","msgtext":"fsadfasdfasdf","uuid":"fJc4lEHji","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:14:12.000000Z","updated_at":"2023-03-30T15:14:12.000000Z"},{"id":6,"sender":3,"room":"1","msgtext":"dxzvfvcxvxcv","uuid":"VVEQHNSm5","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:14:33.000000Z","updated_at":"2023-03-30T15:14:33.000000Z"},{"id":7,"sender":3,"room":"1","msgtext":"vcmbnxcvn","uuid":"IcHshOP2V","edited":0,"files":null,"images":null,"seen":null,"participants":"\"ALL\"","created_at":"2023-03-30T15:18:59.000000Z","updated_at":"2023-03-30T15:18:59.000000Z"}]}
@RobEyre не Seen::where(), а Seen::first(), проблема в том, что какое бы условие ни добавлял автор, он не возвращает результат при выполнении ->first()
Хорошее место - спасибо за определение. Хотя var_dump() должен помочь
Спасибо, но... var_dump($uuid) возвращает 'string(9) "x5qXAtRot" NULL',
Простой if ($seen) { ... } вокруг всего кода, к которому вы обращаетесь $seen-> ..., должен справиться с этим. $seen — это null, которое ->first() может вернуться, поэтому вам нужно обработать этот случай, который вы в настоящее время не делаете. Вы предполагаете, что ->first() возвращает запись на каждой итерации foreach ($romeids as $uuid) { ... }, но это не так, и ваша ошибка говорит вам именно об этом.
@mankowitz Отрицательные отзывы связаны с самоочевидным сообщением об ошибке и отсутствием попыток отладки. Ошибка очень четко говорит о том, что доступ к свойству «просматривается» (->seen) происходит в переменной null ($seen, поскольку единственное место ->seen происходит там и в строке ниже). Если бы запрашивающий выполнил какую-либо отладку, например var_dump($seen), он бы увидел, что экземпляр является null, и мог бы исправить это. Кроме того, на SO есть сотни вопросов с этой точной ошибкой; они не искали ни одного из них, прежде чем задать этот вопрос. Содержание в порядке, процесс отрицательный.
@TimLewis - хорошо, это честно.
Хорошо, Манковиц и ТимЛьюис. Спасибо, что пытаетесь сказать мне, что я делаю что-то неправильно. Я понимаю. Логично, что если я могу получить $seen снаружи цикла for-each, я должен получить его внутри. Я не понимаю. var_dump($seen) не сказал мне, как это исправить или где. Обычно я вижу, как люди задают здесь вопросы, а хорошие люди отвечают решениями и чему-то, чему можно научиться. Я ничего не узнал из этого вопроса, кроме того, что я не знаю, что я делаю неправильно. У кого-нибудь есть решение моей проблемы?
Вы должны понимать, что делаете цикл; каждый раз, когда цикл запускается, $seen будет другим, и в одном из этих циклов $seen — это null, а null->seen, очевидно, недопустимый код. Вы должны справиться с этим. var_dump($seen) — это код отладки, и он может показать вам, когда $seen — это null, или объект, и т. д. Конечный случай заключается в том, что вам нужно справиться с этим; ваша ошибка говорит вам, что $seen является null во время одного из ваших циклов и должна быть обработана, например, добавление if ($seen) { $wasseen = $seen->seen; ... } (... остальная часть кода).
@ТимЛьюис. Большое спасибо. До меня наконец дошло, что ты хотел сказать в первый раз. Спасибо!
Отличный; и приносим свои извинения, если что-то из сказанного нами покажется снисходительным или пренебрежительным; это совсем не то, к чему мы стремимся. Теперь у вас есть правильное представление о вашем рабочем коде; знание того, что является «безопасным» или «небезопасным» кодом (т. е. предположение, что ->first() не может вернуть null) и т. д.) происходит методом проб и ошибок, особенно с кодом поставщика (инфраструктура Laravel). Вы также можете использовать что-то вроде firstOrFail(), если вам нужно, чтобы что-то существовало, или firstOrCreate(), если вы хотите создать что-то, если оно не существует, и т. д. Удачного кодирования!






Спасибо, Тим Льюис.
Это рабочий код!
public function getromes(Request $request)
{
$user = Auth::id();
$romes = Rome::where('room', $request->id)->get();
foreach($romes as $rome){
$seen = Seen::where('message', $rome->romeid)->where('user', $user)->first();
if ($seen && !$seen->seen){
$seen->seen = 1;
$seen->seen_at = Carbon::now();
$seen->save();
}
}
return response()->json([
"message" => "Getting posts was successful",
'romes' => $romes,
], 200);
}
Некоторые улучшения, вы можете удалить переменную $romeids и просто сделать foreach($romes as $rome), затем $seen = Seen::where('message', $rome->romeid). Кроме того, if ($seen) { if ($seen->seen === 0) { ... } } можно переписать как if ($seen && !$seen->seen) { ... } (или подобное); нет необходимости вкладывать if без ветки else или else if.
Seen::where() возвращает null для некоторого значения $uuid. Я предлагаю вам добавить var_dump($uuid) и var_dump($seen), чтобы определить, какое значение является проблемой.