2016-06-26 23 views
3

我有兩個表,產品和子產品。 我也有一個視圖,顯示有關產品的信息(查看從數據庫動態生成的數據)。在這個觀點上,應該顯示所有的副產品。我怎樣才能做到這一點?因爲我循環查看視圖中的第一個查詢,而不是在控制器中。Laravel:控制器中的2個DB查詢,而1個值取決於第一個查詢

控制器:

public function showSpecificProduct($name) 
    { 
     $name = strtolower($name); 
     $product = \DB::select('select * from products where name = ? LIMIT 1', [$name]); 

     $subProducts = \DB::select('select * from subproducts where mainproduct = ?', [/* id from $product belongs here */]); 

     return view('products.single', ['products' => $product, 'subproducts' => $subProducts]); 
    } 

查看:

@foreach ($products as $product) 
      <div class="col-md-4"> 
       <div class="box"> 
        <div class="box-header with-border"> 
         <h3 class="box-title">{{ $product->name }}</h3> 
        </div> 
        <!-- /.box-header --> 
        <div class="box-body"> 
         <img src="{{ $product->img }}" alt="{{ $product->name }}" class="img-responsive"> 
        </div> 
       </div> 
       <!-- /.box --> 
      </div> 
     @endforeach 

此外,有沒有在laravel做第一個查詢更好的方法?因爲我使用的是foreach循環,而只有1行。

預先感謝您

回答

0

您更好地使用Laravel Query Builder爲你的數據庫查詢。

在您使用的方法中,Laravel返回一個JSON對象。它很難用於另一個查詢(我被困在這裏一個星期)。

$product = DB::table('products')->where('name','=','$name')->pluck('id'); 

這將返回所有作爲array.So您可以使用此一foreach循環中的第二個查詢的ID。

+0

謝謝。但是,在第一個隊列中總是隻有一行返回。沒有更好的方法嗎?通過在示例中使用$ product [0]作爲第二行,它不起作用。 – PoTTii

+0

爲什麼不使用連接操作來獲得答案? – Sachith

4

控制器

public function showSpecificProduct($name) 
    { 
     $product = Product::with('subproducts')->where('name', $name)->first(); 

     return view('products.single')->with('products',$product); 
    } 

查看

{{ $product->name }} // shows the name of the mainproduct no need for a foreach 

顯示你所要做的foreach循環(如果他們有很多)中的子

@foreach (($product->subproducts as $subproduct) 
{{ $subproduct->name}} 
@endforeach 

要能夠做到這一點你必須設置在你的模型關係和遷移第一

喜歡這個

1遷移

產品遷移

public function up() 
    { 
     Schema::create('products', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->text('name'); 
      $table->timestamps(); 
     }); 
} 

子產品遷移

public function up() 
    { 
     Schema::create('subproducts', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('product_id')->unsigned(); 
      $table->foreign('product_id')->references('id')->on('subproducts'); 
      $table->text('name'); 
      $table->timestamps(); 
     }); 
} 

刷新你的遷移,如果你沒有正確的外鍵設置,然後

2的模型

添加到您的產品型號

編輯

public function subproducts() { 
    return $this->hasMany('App\Subproduct', 'product_id'); // you can this 
} 

子產品型號

public function product() { // i made a mistake here 
    return $this->belongsTo('App\Product'); 
} 

現在感覺自由使用ORM雄辯。

+0

哇,很好的答案謝謝。我完全忘記了模型......我已經有了migrations,它是一個簡單的'php artisan make:model',或者爲了能夠使用產品類'Product ::',我需要做其他任何事情嗎?如果可能的話,詳細闡述一下hasMany()又是什麼?謝謝。 – PoTTii

+0

當然,好吧,一個產品會有很多子產品嗎?所以你不得不說出那個模型有很多子產品,所以當你使用查詢時,我向你展示了你在控制器雄辯中會弄清楚如何讓你獲得主產品的相關副產品(反之亦然),是的,你只需要創建如果你沒有have'em的模​​型(並且在控制器的頂部不要忘記添加'use App \ Product;' –

+0

quick question。在「2-Models」下,你有2個稱爲subproducts()的函數。 (沒有找到):1054未知列'where子句'中的'subproducts.products_id'(SQL:select * from'子產品',其中的子產品''.products_id'在(2) ))'大約30分鐘後才能看到,product_id後面有一個s,爲什麼?我在數據庫中的字段名爲product_id,並且子產品up()中的coee也沒有s ... – PoTTii

相關問題