#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. Спасибо за вашу помощь, но я уже придумал решение и отредактировал свой пост. 🙂 Я пытался поднять голос, но не могу из-за моей низкой репутации, извините.