Доступ к отношениям Laravel в коде JavaScript
Продукт имеет отношение "один ко многим", "productbrand", с таблицей productbrand и productbrand имеет отношение "один к одному", "бренд", с табличным брендом. Таблетка марки имеет колонку "бренд". И я могу получить доступ к марке продукта. Все другие категории, имя пользователя и т.д. Доступны правильно.
public function show(Request $request)
{
if($request->ajax())
{
$id = $request->id;
if($id)
{
$show = Product::where(['product_id'=>$id])->first();
$category = $show->category->category;
$username = $show->user->username;
$getbrands = $show->productbrand;
foreach($getbrands as $getbrand)
{
$brand=$getbrand->brand->brand;
}
if($show)
{
echo json_encode(array('status' => TRUE, 'show' => $show, 'username' => $username, 'category' => $category, 'brand' => $brand)); die;
}
}
}
echo json_encode(FALSE);die;
}
Ajax и jQuery:
$.ajax({
type: "POST",
url: "{{url('/product/show')}}",
data: {id:id},
success: function (data) {
var res = $.parseJSON(data);
if(res.status == true)
{
var result = 'Category: ' + res.category + '<br>' +
'Product by: ' + res.username + '<br>' +
'Brands: ' + res.brand + '<br>' +
'Price: ' + res.show.price + '<br>' +
'Price type: ' + res.show.price_type + '<br>' +
'Product Views: ' + res.show.views + '<br>';
$('#result').html(result);
}
}
});
Таким образом, я мог получить только один бренд. Я также пробовал следующий путь, но не смог.
В контроллере:
$getbrands = $show->productbrand;
echo json_encode(array('status' => TRUE, 'show' => $show, 'username' => $username, 'category' => $category, 'getbrands' => $getbrands));
В Ajax:
for(var i=0; i<res.getbrands.length; i++)
{
var brands=res.getbrands[i].brand.brand; //First 'brand' is relation and second is the brand I am trying to access
}
Ответы
Ответ 1
Зачем объявлять все эти переменные:
$category = $show->category->category;
$username = $show->user->username;
$getbrands = $show->productbrand;
Если категория, пользователь, productbrand, а затем бренды - это отношение моделей к продукту и выбор категории из категории, имени пользователя и т.д.
Вместо этого поддерживайте отношения с 'with';
public function show(Request $request)
{
if($request->ajax())
{
$id = $request->id;
if($id)
{
$show = Product::where(['product_id'=>$id])->with('category')
->with('user')
->with('productbrand.brand') // product has onetomany relation 'productbrand' with table productbrand and productbrand has onetoone relation 'brand' with table brand
->first();
if($show)
{
echo json_encode(array('status' => TRUE, 'show'=>$show)); die;
}
}
}
echo json_encode(FALSE);die;
И в JavaScript:
if(res.status == true)
{
var result = 'Category: ' + res.show.category.category + '<br>' +
'Product by: ' + res.show.user.username + '<br>' +
'Price: ' + res.show.price + '<br>' +
'Price type: ' + res.show.price_type + '<br>' +
'Product Views: ' + res.show.views + '<br>';
$('#result').html(result);
}
}
});
продукт имеет onetomany отношение 'productbrand' с таблицей productbrand и productbrand имеет onetoone отношение "бренд" с таблицей бренда. Стол-бренд имеет колонку "бренд". И я не могу получить доступ к марке продукта. Получите доступ к такому бренду.
var result = 'Brands: ';
for(var i=0; i<res.show.productbrand.length; i++)
{
result += res.show.productbrand[i].brand.brand;
}
Ответ 2
Используя ваш первый способ.
Измените $brand=$getbrand->brand->brand;
на $brand[] = $getbrand->brand->brand;
И затем в js вы можете переходить к таким брендам:
for(var i=0; i < res.brand.length; i++)
{
console.log(brand[i]);
}
Однако получение таких брендов будет делать много запросов к базе данных.
Вместо этого вы можете использовать желаемую загрузку.
Вот так:
$show = Product::with('productbrand.brand')->where(['product_id'=>$id])->first();
$brand = $show->productbrand->pluck('brand')->collapse();
И получить доступ к нему аналогично в js, как и раньше.
PS: Я предполагаю, что вы используете laravel 5.2.
Ответ 3
Я думаю, вам нужно создать маршрут и использовать AJAX для получения необходимых данных.
После передачи данных в DOM, которые использует javascript, он не знает каких-либо объектных отношений, определенных вами в Laravel.