Попытка получить свойство не-объекта в цикле foreach

Я разрабатываю систему, которая использует Maatwebsite для чтения и записи данных в базу данных из таблицы Excel. , который работает нормально. Теперь перед вставкой данных система проверяет наличие записей в родительской таблице. И если есть какая-либо запись, которая соответствует записи листа, система вставляет внешний ключ в дочернюю схему, а если нет, система сначала создает его, а затем вставляет его идентификатор в качестве внешнего ключа.
Вот класс импорта:

public function collection(Collection $rows){
    $sub_chap = SubChapter::where(['chap_id' => $this->chap_id])->get();
    $chapter = Chapter::where(['chap_id' => $this->chap_id])->first();
    $author = Author::where(['author_status' => 1])->get();
    $book = $chapter->book_id;
    $author_id = 0;
    $sub_chap_id = 0;

    /* Working perfectly fine here...

    foreach($author as $a){
        echo $a->a_name."\r";
    }
    */

    foreach ($rows as $row){
        if($row['quote_english'] != ""){
            foreach($sub_chap as $sub){
                if(trim($sub->sub_chap_english) == trim($row['sub_chap_english'])){
                    $sub_chap_id = $sub->sub_chap_id;
                    break;
                } else{
                    $sub_chap_id = 0;
                }
            }

            if($author->count() > 0){
                foreach($author as $athr){
                    $author_id = (trim($athr->author_name) == trim($row['author_name']))? $athr->author_id : $author_id = 0;
                }
            }

            if($author_id == 0){
                $author = Author::create([
                    'author_name' => $row['author_name'],
                    ...
                    ...
                    'author_status' => 1,
                ]);

                $author_id = $author->author_id;
            }

            $quote = Quote::create([
                'quote_english' => $row['quote_english'],
                'author_id' => $author_id,
                'sub_chap_id' => $sub_chap_id,
                'chap_id' => $this->chap_id,
                'book_id' => $book
            ]);
        }
    }
}

Он говорит:

Попытка получить свойство author_name не-объекта

Я знаю, что эта ошибка возникает, когда вы пытаетесь получить доступ к свойству объекта из экземпляра, не являющегося объектом. get () как обычно возвращает объект коллекции и отлично работает вне цикла foreach (). я не могу понять, почему он не работает внутри цикла. Любая помощь будет оценена по достоинству!


person Saud    schedule 14.09.2019    source источник
comment
Простым тестом было бы использовать что-то вроде var_dump($athr); перед этой строкой и посмотреть, что, по его мнению, представляет собой переменная.   -  person Nigel Ren    schedule 14.09.2019
comment
@NigelRen Я уже сделал то, что написано: object(Illuminate\Database\Eloquent\Collection)#9051 (1) { ["items":protected]=> array(4).... Я также проверяю, что dd ($ athr) возвращает объект коллекции.   -  person Saud    schedule 14.09.2019
comment
Я не знаю, почему он говорит не объект, когда возвращает объект коллекции.   -  person Saud    schedule 14.09.2019


Ответы (1)


Я до сих пор не могу понять, почему он так говорит, да и вообще, похоже, нет. Так что я думаю, что пора опубликовать решение, которое я придумал. Я нашел способ обойти это. Итак, в основном я сохранил всю коллекцию в глобальной переменной и обратился к ней в цикле.

Вот код:

/**
 * Global variable for raavi's data.
 */
public $author;

/**
 * Construction function.
 * 
 * @param int $id
 * @param Collection $arr
 */
function __construct($arr) {
    $this->author= $arr;
}

/**
 * This method is responsible for inserting the excel
 * sheet's rows data to the database schema.
 * 
* @param Collection $rows
*/
public function collection(Collection $rows){
    // other code as it is...
    foreach($this->author['author'] as $athr){
        $author_id = (trim($athr->a_name) == trim($row['author_name']))? $athr->a_id : 0 ;
    }

}

и в моем методе импорта контроллера импорта:

$quotes  = Excel::import(new QuotesImport(compact('author')));

Работает нормально до сих пор. Если есть какие-то улучшения или что-то, что нужно изменить, не стесняйтесь. Буду премного благодарен.

person Saud    schedule 27.09.2019