Laravel 流利 vs Eloquent

Laravel Fluent vs Eloquent

第一题:

为什么 Fluent return 一个 array:

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

虽然 Eloquent return 是 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 模型是 DeckOverviewDeckCard,我如何将上面的内容更改为 Eloquent?和 Card 分别?

第一个问题 Fluent 是一个查询生成器,Eloquent 是一个 ORM。 Eloquent 以 Fluent 为基础。

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

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

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

DeckOverview
hasMany DeckCard

DeckCard
belongsToMany Card
belongsTo DeckOverview

Card 
belongsToMany DeckCard

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

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

这就是 ORM 与您的方法不一致的地方。 ORM 被构建为具有表示 table 中的记录的对象。这里我们有一个 DeckOverview,它有一堆 DeckCards。他们会像这样被访问。

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

或者也许这个...

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

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

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

您可以使用 has 来应用基于关系的约束。这只会加载 DeckOverviews,其中 DeckCards 的棋盘为 0。

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

这里有很多值得学习的地方。这将需要您计划和构建应用程序的方式发生重大转变。