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_overview
、users_deck_cards
、cards
模型是 DeckOverview
、DeckCard
,我如何将上面的内容更改为 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);
});
这里有很多值得学习的地方。这将需要您计划和构建应用程序的方式发生重大转变。
第一题:
为什么 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_overview
、users_deck_cards
、cards
模型是 DeckOverview
、DeckCard
,我如何将上面的内容更改为 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);
});
这里有很多值得学习的地方。这将需要您计划和构建应用程序的方式发生重大转变。