php - Laravel 流利与 Eloquent

标签 php mysql laravel eloquent fluent

第一个问题:

为什么 Fluent 返回一个数组:

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 分别是什么?

最佳答案

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

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

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

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

DeckOverview
hasMany DeckCard

DeckCard
belongsToMany Card
belongsTo DeckOverview

Card 
belongsToMany DeckCard

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

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

这就是 ORM 与您的方法不一致的地方。 ORM 被构建为具有表示表中记录的对象。这里我们有一个 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);
});

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

关于php - Laravel 流利与 Eloquent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586692/

相关文章:

php - htaccess 内部服务器错误,身份验证循环

javascript - Tinymce 无法使用 XAMPP 在本地主机上正确运行?

php - 优化MySQL搜索查询

mysql - 将值从一个字段拆分为两个

php - Laravel - 如何查找外键值

javascript - 如何使用 onclick 事件将 Javascript 变量传递给 PHP

php - symfony ajax 表单动态修改

mysql - 如何在救援模式下备份MySQL?

php - 我如何解决 Laravel 数据库中的迁移?

php - 使用 updateOrCreate() 时重复输入