iT邦幫忙

0

關於 文章 有 多章節頁面 Laravel 項目 的資料表規劃設計的觀念請益

前輩們好!如題:向前輩們請益一下
假設,我有 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)
但是自己覺得資料結構怪怪的,會不會違反 正規化 原則
特向有經驗前輩請教一下,任何協助都感恩在先,謝謝!

1 個回答

1
小魚
iT邦大師 1 級 ‧ 2021-04-16 17:50:22
最佳解答

哪裡違反正規化原則?
而且這問題是屬於SQL,
跟Laravel關係不大.

看更多先前的回應...收起先前的回應...

@小魚大大!
謝謝?您的意見。
您不會覺得pages表中,多了一個user_id,感覺很多餘嗎?

小魚 iT邦大師 1 級 ‧ 2021-04-17 00:26:38 檢舉

喔,
我懂你的意思了,
但是為什麼一定要在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.

小魚 iT邦大師 1 級 ‧ 2021-04-17 10:46:01 檢舉

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 應該修改路線才對。

謝謝大神解答!!

小魚 iT邦大師 1 級 ‧ 2021-04-17 12:16:32 檢舉

不要說跟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應該差不多...

恩恩非常感謝您寶貴意見,我會好好研究一下,謝謝!

我要發表回答

立即登入回答