【问题标题】:Laravel Fluent vs EloquentLaravel Fluent vs Eloquent
【发布时间】:2015-08-15 16:35:37
【问题描述】:

第一个问题

为什么Fluent 会返回array

return DB::connection('mysql')->table('cards')
    ->where('setCode', '=', $setcode)
    ->get();

Eloquent 返回object

return Card::where('setCode', '=', $setcode)
    ->get();

据我所知,数据本身看起来完全一样。

第二个问题

以下代码在Fluent:

DB::table('auth.users_deck_overview as deckOverviewDB')
        ->leftJoin('auth.users_deck_cards as deckCardsDB', 'deckOverviewDB.deck_uid', '=', 'deckCardsDB.deck_uid')
        ->leftJoin('mtg_cards.cards as cardsDB', 'deckCardsDB.card_uid', '=', 'cardsDB.uid')
        ->select('cardsDB.name', 'deckCardsDB.card_quantity', 'cardsDB.manaCost', 'cardsDB.colors', 'cardsDB.cmc')
        ->where('deckOverviewDB.username', '=', $user->username)
        ->where('deckOverviewDB.deck_uid', '=', $deckUid)
        ->where('deckCardsDB.board', '=', 0)
        ->where('cardsDB.cmc', '!=', '')
        ->get();

假设users_deck_overviewusers_deck_cardscards 模型分别为DeckOverviewDeckCardCard,我将如何将上述更改为Eloquent

【问题讨论】:

    标签: php mysql laravel eloquent fluent


    【解决方案1】:

    第一个问题 Fluent 是一个查询构建器,而 Eloquent 是一个 ORM。 Eloquent 建立在 Fluent 之上。

    第二个问题 简短的回答是你不会。 ORM 并不真正适合以这种方式做事。这是方钉/圆孔的情况。

    Laravel 还应用约定优于配置。在您的情况下,这意味着您最好尝试重组数据库以匹配 Eloquent 的约定,而不是配置 Eloquent 以匹配您的数据库架构。

    ORM 结构的过度简化视图可能如下所示。

    DeckOverview
    hasMany DeckCard
    
    DeckCard
    belongsToMany Card
    belongsTo DeckOverview
    
    Card 
    belongsToMany DeckCard
    

    提取所有数据的最佳方式是通过预先加载。

    $deckOverview = DeckOverview::with('deckCards.cards')->first();
    

    这是 ORM 与您的方法真正不一致的地方。 ORM 被构建为具有表示表中记录的对象。这里我们有一个包含一堆 DeckCard 的 DeckOverview。他们会像这样被访问。

    $deckCard = $deckOverview->deckCards->first();
    

    或者这个……

    foreach ($deckOverview->deckCards as $deckCard) 
    {
        foreach ($deckCard->cards as $card)
        {
            // do something with each card in the deck
        }
    }
    

    您可以限制通过预先加载提取的结果。这只会加载棋盘为 0 的 DeckCard。

    $deckOverviews = DeckOverview::with(array('deckCards' => function ($query) 
    {
        // Equals comparison operator can be assumed
        $query->where('board', 0);
    })->get()
    

    您可以使用必须基于关系应用约束。这只会加载具有棋盘为 0 的 DeckCards 的 DeckOverviews。

    $deckOverviews = DeckOverview::has(array('deckCards' => function ($query)
    {
        $query->where('board', 0);
    });
    

    这里有很多东西可以吸收。这将需要您在规划和构建应用程序的方式上发生重大转变。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2016-12-06
      • 2016-01-14
      相关资源
      最近更新 更多