2016-08-12 5 views
13

Produkt hat eine Eins-zu-viele-Beziehung, 'Produktmarke', mit Tabelle Produktmarke und Produktmarke hat eine Eins-zu-Eins-Beziehung, 'Marke', mit Tischmarke. Tischmarke hat eine Spalte, "Marke". Und ich kann auf die Marke des Produkts zugreifen. Auf alle anderen Kategorien, Benutzernamen usw. wird korrekt zugegriffen.Zugriff auf Laravel-Beziehungen in JavaScript-Code

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 und 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); 
     } 
    } 
}); 

So kann ich nur eine Marke bekommen. Ich habe auch den folgenden Weg versucht, aber gescheitert.

In der Steuerung:

$getbrands = $show->productbrand; 
echo json_encode(array('status' => TRUE, 'show' => $show, 'username' => $username, 'category' => $category, 'getbrands' => $getbrands)); 

In 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 
} 
+0

starten: $ show = Artikel :: wo ([ 'product_id' => $ id]) -> mit ('productbrand') -> ersten(); –

+0

@Autista_z Das Problem ist der Zugriff mit Javascript. – micky

+0

Ich schrieb eine Antwort, aber ich habe bemerkt, dass Ihr Code sehr, sehr seltsam ist. Ich empfehle Ihnen, einen Blick auf www.laracasts.com zu werfen. Sie werden viel über Laravel lernen. Viel Glück. –

Antwort

6

Warum diese Variablen alle erklären:

$category = $show->category->category; 
$username = $show->user->username; 
$getbrands = $show->productbrand; 

Wenn Kategorie, Benutzer, productbrand und dann Marken mit Produktmodellen Beziehung sind und aus der Kategorie zu holen Kategorie, Benutzernamen Benutzer usw.

Stattdessen halten die Beziehungen zu 'mit';

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; 

Und in 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); 
     } 
    } 
}); 

Produkt hat OneToMany Beziehung 'productbrand' mit Tisch productbrand und productbrand hat OneToOne Beziehung 'Marke' mit Tisch Marke. Tischmarke hat eine Spalte "Marke". Und ich bin nicht in der Lage, auf die Marke des Produkts zuzugreifen. Access-Marke wie folgt.

var result = 'Brands: '; 
for(var i=0; i<res.show.productbrand.length; i++) 
{ 
    result += res.show.productbrand[i].brand.brand; 
} 
2

Ich denke, Sie eine Route erstellen sollte und AJAX verwenden, um die Daten, die Sie benötigen. Sobald Sie die Daten an das DOM übergeben, das JavaScript verwendet, hat es keine Kenntnisse über die Objektbeziehungen, die Sie in Laravel definiert haben.

3

Verwenden Sie Ihren ersten Weg.

ändern $brand=$getbrand->brand->brand; zu $brand[] = $getbrand->brand->brand;

Und dann in js Sie über die Marken wie dies gehen kann:

for(var i=0; i < res.brand.length; i++) 
{ 
    console.log(brand[i]); 
} 

jedoch immer Marken wie dies wird eine Menge von Datenbank-Abfrage tun.

Stattdessen können Sie eifrig laden verwenden.

So:

$show = Product::with('productbrand.brand')->where(['product_id'=>$id])->first(); 
$brand = $show->productbrand->pluck('brand')->collapse(); 

und greifen Sie auf die gleiche Weise wie zuvor in js.

PS: Ich nehme an, dass Sie Laravel 5.2 verwenden.