Laravel只留下了右表的最后记录

时间:2016-06-29 08:15:51

标签: php mysql sql laravel

我是laravel的新手。

我有两张桌子。 1)产品 2)价格

-----------------------------
- products                  -
-----------------------------
- id_product | int (p_key)  -
- name       | varchar      -
-----------------------------

-------------------------
- prices                -
-----------------------------
- id_price   | int (p_key)  -
- id_product | int          -
- price      | int          -
-----------------------------

products表包含有关idname等产品的数据,... 价格变化存储在prices表格中,其中最后一条记录是应向用户显示的最新价格。

现在我想搜索products并从prices表中获取每个产品的最后价格。这是我的疑问:

$result = DB::table('products')->leftJoin('prices', function($join) {
    $join->on('products.id_product', '=', 'prices.id_product');
})->whereRaw(MY_SEARCH_FILTERS);

上面的代码是错误的,因为如果产品在prices表中有4条记录,那么它将在$result中重复4次,但只显示最后一条价格的1条记录。< / p>

4 个答案:

答案 0 :(得分:1)

您可以使用Laravel Elquent使其变得简单:

class Product extends Model
{
   public function lastPrice()
    {
        // optional: change id_price  to created_at by add created_at to prices table 
        return $this->hasOne(Price::class)->orderBy('id_price', 'DESC');
    }

}

现在

public function getProducts(){
 $MY_SEARCH_FILTERS=....;
 // get all products with last price 
 $products=Product::with('lastPrice')->whereRaw(MY_SEARCH_FILTERS)->get()  
 return   $products
}

答案 1 :(得分:0)

你需要在这里添加两件事,

1)orderBy降价价格表 2)DB :: table函数中的第一个子句(它只获取1条记录,这将是最新的价格)

解决方案:

$result = DB::table('products')
->leftJoin('prices',function($join)
                    {
                      $join->on('products.id_product', '=',  'prices.id_product')
                    })->whereRaw(MY_SEARCH_FILTERS)
->orderBy('prices.id_price','desc')
->first();

您也可以使用(Laravel 5.1):

$result = DB::table('products')
          ->leftJoin('products.id','=','prices.id_product')
          ->whereRaw(MY_SEARCH_FILTERS)
          ->orderBy('prices.id_price','desc')
          ->first();

答案 2 :(得分:0)

在这里,我们有2个表 users answers ,其中 users 是左表,而 answers 是右表有用户答案。

我们想让用户答案保持联接,但该联接应与最新记录或 answers 表保持一致。

$query = Users::select('users.id', 'users.user_name','answers.created_at as last_activity_date')
->leftJoin('answers', function($query) 
{
   $query->on('users.id','=','answers.user_id')
   ->whereRaw('answers.id IN (select MAX(a2.id) from answers as a2 join users as u2 on u2.id = a2.user_id group by u2.id)');
})
->where('users.role_type_id', Users::STUDENT_ROLE_TYPE)->get();

答案 3 :(得分:0)

这里有2个表' articles '和' comments ',其中 articles 是左表,而 comments 是有文章评论的右表。

我们想保留与 articles 一起加入的 comments ,但该加入应与 {{1} } 表。

comments

我从这里https://laravelcode.com/post/how-to-get-last-record-from-leftjoin-table-in-laravel

找到了这个解决方案