前輩們好!如題:向前輩們請益一下
假設,我有 laravel 項目 alticle.test 包含有 Alticle.php 、 Page.php 、 User.php
模型
其中 User 模型 的資料結構為:
id,
email,
password,
name
Alticle 模型 的資料結構為:
id,
user-id,
title,
brief
Page 模型 的資料結構為:
id,
alcitle_id,
comment
其中 User 模型關係為:
public function alcitles()
{
return $this->hasMany('Alcitle');
}
其中 Alcitle 模型關係為:
public function user()
{
return $this->belongsTo('User');
}
public function pages()
{
return $this->hasMany('Page');
}
其中 Page 模型關係為:
public function alcitle()
{
return $this->belongsTo('Alcitle');
}
我的疑惑是:因為我常需要在控制器中 ex: PageController@edit() 中
public function edit(Request $request, Alcitle $alcitle, $id)
{
$user = $request->user();
$alticle = Alcitle::where('user_id', $id)->get();
$pages = $alcitle->pages; //此時是一個集合
//後面我要進行的邏輯需要的是 剔除用戶非法從網址列修改參數的操作
//我想要進行如下操作 需要 $page 單例 id
if ($user->id == $page->user_id) {
//處裡邏輯
} else {
return redirect('/')->with('flash_alert', '錯誤操作,拒絕訪問!');
}
//但是要獲取 $page->user_id 很不方便--->因此 有第 2 種想法如下段:
}
Page 模型 的資料結構為:
id,
user_id,
alcitle_id,
comment
(若這樣可以很方便拿到$page 所屬於的 user_id)
但是自己覺得資料結構怪怪的,會不會違反 正規化 原則
特向有經驗前輩請教一下,任何協助都感恩在先,謝謝!
哪裡違反正規化原則?
而且這問題是屬於SQL,
跟Laravel關係不大.
@小魚大大!
謝謝?您的意見。
您不會覺得pages表中,多了一個user_id,感覺很多餘嗎?
喔,
我懂你的意思了,
但是為什麼一定要在Pages加一個欄位呢?
你會寫取得Pages的SQL語法嗎?
@小魚大大!
我的主要目的只是獲取pages 的 user_id,假如我的情況如下:
這時我能怎樣獲取 $pages 都屬於 哪一個 User_id ???
public function edit(Request $request, Alcitle $alcitle, $id)
{
$user = $request->user();
$alticle = Alcitle::where('user_id', $id)->get();
$pages = $alcitle->pages; //此時是一個集合
User
public function pages()
{
return $this->hasMany('Page');
}
Page
public function user()
{
return $this->belongsTo('User');
}
我試過這樣的關聯,但是當我執行
dd($pages->user()->id);
他報錯!
BadMethodCallException
Method Illuminate\Database\Eloquent\Collection::user does not exist.
article為什麼變成alcitle了?
你寫的方向好像跟我寫得不一樣,
(話說網路上的竟然跟你一樣...)
我都是在Article裡面寫User然後寫hasone的...
另外你的兩個id並不是對應的,
你在hasOne跟belongsTo裡面應該要定義對應的欄位.
另外你要拿page應該直接一個SQL就可以拿到了吧,
不需要在page再加一個user_id,
要寫這個可能要先了解一下SQL.
article為什麼變成alcitle了?
是我筆誤了,So sorry!
我目前問題 與SQL 較無關係,主要是 Lravel 集合的用法不熟悉,
現在大概明瞭 $pages 要拿到 User_id 一定是要 for 或 foreach 之後才拿得到,
我不能再想 $pages->use_id 應該修改路線才對。
謝謝大神解答!!
不要說跟SQL沒關係,
本來就是用SQL去取資料的,
如果不懂SQL也寫不好Laravel,
只能寫非常簡單沒甚麼關聯的資料.
我可以給你一個我寫的Function,
你研究看看.
$FeedBackPaginate = FeedBack::whereHas('User', function ($query) use($userdata) {
$query->where('company_id', $userdata->company_id);
});
這個FeedBack裡面寫
//關聯
public function User()
{
return $this->hasOne('App\Entity\User', 'id', 'user_id');
}
FeedBack是User的意見回饋,
然後用
@foreach($FeedBackPaginate as $data)
去跑資料,
$data->User->lastname
就可以取到User的資料了.
不過我學的hasOne方向跟你的好像不一樣,
跟網路上看到的也不一樣,
我是Feedback去 hasOne User,
你是User去hasMany Feedback,
不過一般的需求感覺比較接近我這種方式,
可能兩種方式都可以用吧,
轉成SQL應該差不多...
恩恩非常感謝您寶貴意見,我會好好研究一下,謝謝!
I like that you describe in detail the information related to this topic. I appreciate that and hope you keep up the good work. retro bowl