Laravel получает свойство экземпляра Eloquent builder

#php #laravel #eloquent

Вопрос:

У меня возникли проблемы с доступом к значениям свойств имени поставщика или описания поставщика. Эта функция вызова $vendor->vendorname; вернет ошибку Property [vendorname] does not exist on the Eloquent builder instance.

Как я могу получить доступ к значению свойства имени поставщика или описания поставщика? Спасибо

Объект возврата модели на веб-сайте

  IlluminateDatabaseEloquentBuilder {#1330 ▼
  #query: IlluminateDatabaseQueryBuilder {#381 ▶}
  #model: AppModelsVendor {#1349 ▼
    #fillable: array:2 [▶]
    #connection: "mysql"
    #table: "vendors"
    #primaryKey: "id"
    #keyType: "int"
     incrementing: true
    #with: []
    #withCount: []
     preventsLazyLoading: false
    #perPage: 15
     exists: true
     wasRecentlyCreated: false
    #attributes: array:5 [▼
      "id" => 2
      "created_at" => "2021-08-01 11:48:20"
      "updated_at" => "2021-08-01 11:48:20"
      "vendorname" => "cloyad"
      "vendordescription" => "cloyad"
    ]
    #original: array:5 [▶]
    #changes: []
    #casts: []
    #classCastCache: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: array:1 [▶]
    #touches: []
     timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [▶]
  }
  #eagerLoad: []
  #localMacros: []
  #onDelete: null
  #passthru: array:19 [▶]
  #scopes: []
  #removedScopes: []
}
 

Функция контроллера в приложении/Http/Контроллеры

     public function index(User $user, Request $request){
        //Retrieve the favroutie listings from user
        $fav = User::with('posts')->get()->where('id', $user->id);
        //dd($fav);
        $favArray = [];
        foreach($fav as $t){
            foreach($t->posts as $p){
                $collection = collect();
                $collection->push($p);
                $vendor = Vendor::with('posts')->first()->where('post_id', $p->id);
                dd($vendor->vendorname);
                array_unshift($favArray, $p);
            }
        }
    }
 

Решение, которое можно получить из обеих моделей с помощью сводной таблицы

 public function index(User $user, Request $request){
        //Retrieve the favroutie listings from user
        $fav = User::with('posts')->get()->where('id', $user->id);
        //dd($fav);
        $favArray = [];
        foreach($fav as $t){
            foreach($t->posts as $p){
                $collection = collect();
                $collection->push($p);
                $vendor = Vendor::with('posts')->get();
                foreach($vendor as $v){
                    foreach($v->posts as $vv){
                        if($vv->id == $p->id){
                            $collection->push($v);
                        }
                    }
                }
                array_unshift($favArray, $collection);
            }
        }
 

Комментарии:

1. Добро пожаловать в SO. Пожалуйста, добавьте свой php — код в свой вопрос.

2. Я уже добавил в php-код, спасибо

3. $vendor = Vendor::with('posts')->where('post_id', $p->id)->first(); вы можете попробовать

4. спасибо, но это не работает, потому что «post_id» из сводной таблицы. Для этого требовалось получить все элементы до него и запросить его. Я уже сам придумал решение и отредактировал свой вопрос.

Ответ №1:

Вы можете запросить всех необходимых поставщиков перед вводом цикла foreach, а затем выполнить поиск по возвращенным элементам в памяти.

 foreach($fav as $t){
    $vendors = Vendor::with('posts')->whereIn('post_id', data_get($t->posts, '*.id', []))->get();
    foreach($t->posts as $p){
        $collection = collect();
        $collection->push($p);
        $vendor = $vendors->where('post_id', $p->id)->first();
        dd($vendor->vendorname);
        array_unshift($favArray, $p);
    }
}
 

Комментарии:

1. Спасибо за вашу помощь, но я уже придумал решение и отредактировал свой пост. 🙂 Я пытался поднять голос, но не могу из-за моей низкой репутации, извините.