幾個小時前我已經(jīng)發(fā)布了一個相關(guān)的問題,但我不明白為什么Laravel的Eloquent如此復(fù)雜。。。我又一次讀了很多關(guān)于這個問題的帖子,但沒有一個給我一個非常簡單的請求的解決方案。
下面是一個簡單的例子,一篇文章只屬于一篇文章和一個用戶。因此,這些關(guān)系在Post模型中定義如下:
public function article()
{
return $this->belongsTo(Article::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
我是一個很新的LaravelEloquent。。。因此,我只想根據(jù)上面模型中定義的關(guān)系,顯示一個包含所有帖子的列表,其中包含它們的id、評論、相關(guān)用戶名和文章標(biāo)題。我相信這很簡單,我今天剛剛學(xué)會了“with”。
所以在后控制器中,我有:
$posts = Post::orderBy($sortField,$sortOrder)
->with(['article','user'])
->get();
這讓我收集了所有的帖子。
第一個問題,我是否必須操作這兩個相關(guān)字段,使它們在下面的列表視圖中易于訪問?或者我可以通過把它放到查詢中來避免控制器中的這種情況嗎?
foreach ($posts as $post) {
$post->article = $post->article()->pluck('article');
$post->user = $post->user()->pluck('name');
}
在上面的例子中,$post->article字段列出了數(shù)組中的所有文章標(biāo)題(article字段)。
如果在末尾加上[0],則得到數(shù)組的第一個元素。
如果我使用[post->article\u id],我會得到錯誤的相關(guān)標(biāo)題。
所以沒有什么是我想要的。。。為什么這么復(fù)雜???
最后,下面是我在列表視圖中需要做的事情。
@foreach ($posts as $post)
<p>{{ $post->id }} : {{ $post->comment }} by {{ $post->name }} from article {{ $post->article }}</p>
@endforeach
通過在查詢生成器中執(zhí)行查詢,我可以立即得到所需的。。。那么如何在Eloquent中做到這一點呢?
$users = DB::table('posts')
->join('articles', 'articles.id', '=', 'posts.user_id')
->join('users', 'users.id', '=', 'posts.user_id')
->select('users.*', 'articles.article', 'users.name')
->get();
不清楚是什么讓你誤解了它,所以這里有一個解釋。
首先,在post模型中有兩個
belongsTo
關(guān)系user
&article
。當(dāng)你運行這個
您將獲得一個post和的集合,文章和用戶分別位于
$post->article
&$post->user
屬性中。queryBuild將啟動3個查詢,一個用于帖子,一個用于文章,一個用于用戶的final。現(xiàn)在,在blade中,您希望訪問文章模型中的屬性
article
,該屬性位于Post模型中,因此您可以這樣做:注意:當(dāng)您調(diào)用
$post->article()
時,您會得到一個查詢生成器,因此您可以使用first()
=>模型實例/nullget()
=>模型實例的集合或空集合pluck()
=>屬性的數(shù)組value()
=>第一個元素的值,就好像你使用了puck一樣當(dāng)您調(diào)用
$post->article
而不使用括號時,它將運行:first()
如果關(guān)系是belongsToget()
如果關(guān)系是belongdomany或HasMany或。。。。OR
如果已經(jīng)獲取了屬性(集合或模型實例),它將為您提供該屬性。
因此,由于您在第一個查詢(已經(jīng)獲取)中使用了
with('article')
,$post->article將返回模型文章的一個實例,并且不會運行新的查詢。