Свойство объекта внутри for each возвращает: «Попытка прочитать свойство при нулевом значении»

Я пытаюсь получить свойство $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"}]}

Seen::where() возвращает null для некоторого значения $uuid. Я предлагаю вам добавить var_dump($uuid) и var_dump($seen), чтобы определить, какое значение является проблемой.

Rob Eyre 31.03.2023 15:49

@RobEyre не Seen::where(), а Seen::first(), проблема в том, что какое бы условие ни добавлял автор, он не возвращает результат при выполнении ->first()

matiaslauriti 31.03.2023 15:50

Хорошее место - спасибо за определение. Хотя var_dump() должен помочь

Rob Eyre 31.03.2023 15:54

Спасибо, но... var_dump($uuid) возвращает 'string(9) "x5qXAtRot" NULL',

eddbreuer 31.03.2023 16:32

Простой if ($seen) { ... } вокруг всего кода, к которому вы обращаетесь $seen-> ..., должен справиться с этим. $seen — это null, которое ->first() может вернуться, поэтому вам нужно обработать этот случай, который вы в настоящее время не делаете. Вы предполагаете, что ->first() возвращает запись на каждой итерации foreach ($romeids as $uuid) { ... }, но это не так, и ваша ошибка говорит вам именно об этом.

Tim Lewis 31.03.2023 17:08

@mankowitz Отрицательные отзывы связаны с самоочевидным сообщением об ошибке и отсутствием попыток отладки. Ошибка очень четко говорит о том, что доступ к свойству «просматривается» (->seen) происходит в переменной null ($seen, поскольку единственное место ->seen происходит там и в строке ниже). Если бы запрашивающий выполнил какую-либо отладку, например var_dump($seen), он бы увидел, что экземпляр является null, и мог бы исправить это. Кроме того, на SO есть сотни вопросов с этой точной ошибкой; они не искали ни одного из них, прежде чем задать этот вопрос. Содержание в порядке, процесс отрицательный.

Tim Lewis 31.03.2023 22:01

@TimLewis - хорошо, это честно.

mankowitz 02.04.2023 02:44

Хорошо, Манковиц и ТимЛьюис. Спасибо, что пытаетесь сказать мне, что я делаю что-то неправильно. Я понимаю. Логично, что если я могу получить $seen снаружи цикла for-each, я должен получить его внутри. Я не понимаю. var_dump($seen) не сказал мне, как это исправить или где. Обычно я вижу, как люди задают здесь вопросы, а хорошие люди отвечают решениями и чему-то, чему можно научиться. Я ничего не узнал из этого вопроса, кроме того, что я не знаю, что я делаю неправильно. У кого-нибудь есть решение моей проблемы?

eddbreuer 03.04.2023 16:31

Вы должны понимать, что делаете цикл; каждый раз, когда цикл запускается, $seen будет другим, и в одном из этих циклов $seen — это null, а null->seen, очевидно, недопустимый код. Вы должны справиться с этим. var_dump($seen) — это код отладки, и он может показать вам, когда $seen — это null, или объект, и т. д. Конечный случай заключается в том, что вам нужно справиться с этим; ваша ошибка говорит вам, что $seen является null во время одного из ваших циклов и должна быть обработана, например, добавление if ($seen) { $wasseen = $seen->seen; ... } (... остальная часть кода).

Tim Lewis 03.04.2023 18:21

@ТимЛьюис. Большое спасибо. До меня наконец дошло, что ты хотел сказать в первый раз. Спасибо!

eddbreuer 03.04.2023 18:43

Отличный; и приносим свои извинения, если что-то из сказанного нами покажется снисходительным или пренебрежительным; это совсем не то, к чему мы стремимся. Теперь у вас есть правильное представление о вашем рабочем коде; знание того, что является «безопасным» или «небезопасным» кодом (т. е. предположение, что ->first() не может вернуть null) и т. д.) происходит методом проб и ошибок, особенно с кодом поставщика (инфраструктура Laravel). Вы также можете использовать что-то вроде firstOrFail(), если вам нужно, чтобы что-то существовало, или firstOrCreate(), если вы хотите создать что-то, если оно не существует, и т. д. Удачного кодирования!

Tim Lewis 03.04.2023 18:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
11
124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо, Тим Льюис.

Это рабочий код!

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.

Tim Lewis 03.04.2023 18:56

Другие вопросы по теме