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
,DeckCard
和Card
分别?
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)
这里有很多东西需要考虑.这将需要对您计划和构建应用程序的方式进行重大转变.