Kohana 联合 orm 工厂

Kohana combine orm factories

提问人:Starina 提问时间:4/12/2022 更新时间:12/29/2022 访问量:41

问:

我有两家工厂,“新闻”和“Photoset”。我可以以某种方式将它们组合在一起吗?

$news = ORM::factory('News')
        ->where('title_'.I18n::$lang, '<>', '')
        ->and_where('image', '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 1)
        ->and_where('date', '<', DB::expr('UNIX_TIMESTAMP()'))
        ->order_by('date','desc')
        ->limit(4)
        ->find_all();

$photoset = ORM::factory('Photoset')
        ->where('name_'.I18n::$lang, '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 0)
        ->order_by('date','desc')
        ->limit(4)
        ->find_all();
ORM 工厂 Kohana

评论


答:

0赞 Starina 4/12/2022 #1

Okey,只是将它们转换为数组并合并。

$news = ORM::factory('News')
        ->where('title_'.I18n::$lang, '<>', '')
        ->and_where('image', '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 1)
        ->and_where('date', '<', DB::expr('UNIX_TIMESTAMP()'))
        ->order_by('date','desc')
        ->limit(4)
        ->find_all()
        ->as_array();

$photoset = ORM::factory('Photoset')
        ->where('name_'.I18n::$lang, '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 0)
        ->order_by('date','desc')
        ->limit(4)
        ->find_all()
        ->as_array();

$newArray = Arr::merge($news, $photoset);
0赞 bato3 12/29/2022 #2

您要执行的操作等同于 SQL。ORM 不是为此而生的......UNION

第二件事是将 SQL 结果映射到 Kohana 中的对象很慢。(但你似乎没有这样做。如果只需要显示结果,最好使用查询生成器。


$q2 = DB::SELECT('id', DB::expr('set' AS 't'))->from('photoset')
        ->where('name_'.I18n::$lang, '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 0)
        ->order_by('date','desc')
        ->limit(4);
$q = DB::SELECT('id', DB::expr('news' AS 't'))->from('news')
        ->where('title_'.I18n::$lang, '<>', '')
        ->and_where('image', '<>', '')
        ->and_where('published', '=', 1)
        ->and_where('is_slider', '=', 1)
        ->and_where('date', '<', DB::expr('UNIX_TIMESTAMP()'))
        ->order_by('date','desc')
        ->limit(4)
     ->union($q2, TRUE);
$newArray = $q->execute()->as_array();