Php Laravel 4,混乱雄辩的连接查询

Php Laravel 4,混乱雄辩的连接查询,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我正在做一个混乱的项目,数据库的结构是: Object id, title, description, url ... [and some more columns] ObjectMeta object_id, variable, value 让我们给你: Object: 1, 'Cool Book', 'This cool book is just for you!', ... Object Meta: 1, 'author_name', 'John Doe' 1, 'released'

我正在做一个混乱的项目,数据库的结构是:

Object
id, title, description, url ... [and some more columns]

ObjectMeta
object_id, variable, value
让我们给你:

Object: 1, 'Cool Book', 'This cool book is just for you!', ...

Object Meta:
1, 'author_name', 'John Doe'
1, 'released', 2014
1, 'price', 23.22
1, 'url', 'http://amazon.com/coolbook'
1, 'genre', 3
因此,我需要执行以下查询:

拉取所有具有类型3的对象,然后按其发布日期对这些对象进行排序

$objs = static::Active()
->where('object', '=', $object)
->where('category','=',$category)
->whereIn('site_id', array(self::$site_id, 0))
->leftJoin('object_meta', function($join)
{
  $join->on('object.id','=', 'object_meta.content_id');
})
->where('object_meta.variable', 'genre')
->where('object_meta.value', 3);
->where('object_meta.variable', 'released');
->orderBy('object_meta.value', 'desc');
->groupBy('object.id')
->paginate(20);
即使有很多这样的书,这个查询也有0个结果。我知道第二个object_meta.variable在这里是有罪的。如何编写此查询以使其工作

非常感谢你的帮助

--编辑

我已经创建了变通方法,但它真的非常糟糕(有趣的是,我发誓上面的查询已经运行了一个月左右)

您需要的是内部联接(
join()
),而不是
leftJoin()
,您需要它两次:

$objs = static::Active()
 ->where('object', '=', $object)
 ->where('category','=',$category)
 ->whereIn('site_id', array(self::$site_id, 0))

 ->join('object_meta as genre', function ($join) {
   $join->on('object.id', '=', 'genre.content_id')
      ->where('genre.variable', '=', 'genre')
      ->where('genre.value', '=', 3);
 })
 ->join('object_meta as released', function ($join) {
   $join->on('object.id', '=', 'released.content_id')
      ->where('released.variable', '=', 'released');
 })

 ->orderBy('released.value', 'desc');
 ->select('object.*', 'released.value as released')

 ->distinct()
 // or group by, doesn't matter in your case
 // ->groupBy('object.id')

 ->paginate(20);
然后,您的对象将具有具有适当值的附加属性


根据评论:

如果要动态添加联接,我建议使用如下范围:

public function scopeGenre($query, $value)
{
   $query->join('object_meta as genre', function ($join) use ($value) {
       $join->on('object.id', '=', 'genre.content_id')
          ->where('genre.variable', '=', 'genre')
          ->where('genre.value', '=', $value);
     });
}
然后:


使用
->其中('object_meta.variable','released')
您试图找到一列,其中
变量
既等于
类型
又等于
发布
?这可能就是它返回0行的原因。调试查询时,您应该做的第一件事是查看
DB::getQueryLog()。您还可以->toSql()并使用控制台直接对数据库运行该查询。是的,我知道这个问题。当通过控制台对数据库运行查询时,查询不起作用。我真正想要的是以某种方式将“META.VAR”和“META.VALUE”信息注入我的“对象”。所以我可以直接调用object.released、object.author、object.url,然后得到“META.VALUE”,这就是我想要的!有没有办法在X连接中包含X变量(基本上是每个元对象),这样我就可以使用所有其他属性?用户可以定义诸如“流派”、“发布”之类的变量。您的意思是像那个些加入的动态数量?是的。基本上,书籍有大约6个元对象(流派、url、价格等),而音乐或视频有更多的元对象(大约10个)。我可以在需要的时候手动添加连接,但查询所有元对象会更好。使用您的代码,我将能够使用genre.value和released.value,但对于url.value,我需要进行另一次加入。请不要再介意了!在这个加入问题上工作了3个小时后,我无法正确思考。使用simply foreach和使用参数解决它->
public function scopeGenre($query, $value)
{
   $query->join('object_meta as genre', function ($join) use ($value) {
       $join->on('object.id', '=', 'genre.content_id')
          ->where('genre.variable', '=', 'genre')
          ->where('genre.value', '=', $value);
     });
}
$query->where(..)->genre(3)->...