Laravel Fluent vs Eloquent

rot*_*rcz 3 php mysql fluent laravel eloquent

第一个问题:

为什么Fluent返回array:

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

虽然Eloquent返回一个object:

return Card::where('setCode', '=', $setcode)
    ->get();
Run Code Online (Sandbox Code Playgroud)

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

第二个问题:

以下代码位于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();
Run Code Online (Sandbox Code Playgroud)

我将如何改变以上Eloquent假设users_deck_overview,users_deck_cards,cards模型是DeckOverview,DeckCardCard分别?

Col*_*mes 6

First Question Fluent是一个查询构建器,Eloquent是一个ORM.Eloquent建立在Fluent之上.

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

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

ORM结构的简化视图可能如下所示.

DeckOverview
hasMany DeckCard

DeckCard
belongsToMany Card
belongsTo DeckOverview

Card 
belongsToMany DeckCard
Run Code Online (Sandbox Code Playgroud)

提取所有数据的最佳方式是通过急切加载.

$deckOverview = DeckOverview::with('deckCards.cards')->first();
Run Code Online (Sandbox Code Playgroud)

这是ORM真正不符合您的方法的地方.构建ORM以具有表示表中记录的对象.在这里,我们有一个DeckOverview,它有一堆DeckCards.他们会被这样访问.

$deckCard = $deckOverview->deckCards->first();
Run Code Online (Sandbox Code Playgroud)

或许这......

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

您可以限制通过急切加载提取的结果.这只会加载董事会为0的DeckCards.

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

您可以使用has来基于关系应用约束.这只会加载具有DeckCards的DeckOverviews,其中董事会为0.

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

这里有很多东西需要考虑.这将需要对您计划和构建应用程序的方式进行重大转变.