我想要用seeder 產生一些測試資料,因此
首先我執行
php artisan make:seeder 88asSeeder
結果檔案生成都正常如圖
然後我寫好for 迴圈之後,先執行
composer dump_autoload
結果顯示也正常
Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 4077 classes
然後我執行db:seed
php artisan db:seed --class 88asSeeder
就一直報錯了如下:
Illuminate\Contracts\Container\BindingResolutionException : Target class [88asSeeder] does not exist.
at C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:805
801|
802| try {
803| $reflector = new ReflectionClass($concrete);
804| } catch (ReflectionException $e) {
> 805| throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
806| }
807|
808| // If the type is not instantiable, the developer is attempting to resolve
809| // an abstract type such as an Interface or Abstract Class and there is
Exception trace:
1 ReflectionException::("Class 88asSeeder does not exist")
C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:803
2 ReflectionClass::__construct("88asSeeder")
C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\Container.php:803
Please use the argument -v to see more details.
如上,有請哪位高手解迷津,幫幫忙!
是不是,
不能用數字開頭?
一般來說好像都用英文開頭.
很多地方都不能用數字開頭.
我把 88asSeeder 改成 asSeeder後,報錯已經不一樣了如下:
Symfony\Component\Debug\Exception\FatalThrowableError : Call to undefined function Str_random()
at C:\AppServ\www\3zzz\etk\database\seeds\asSeeder.php:19
15| $arr = [];
16| for ($i=0; $i <20 ; $i++) {
17| # code...
18| $tmp = [];
> 19| $tmp['username'] = Str_random(20);
20| $tmp['password'] = Str_random(20);
21| $tmp['email'] = rand(100000, 9999999).'@gmail.com';
22| $arr[] = $tmp;
23| }
Exception trace:
1 asSeeder::run()
C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32
2 call_user_func_array([])
C:\AppServ\www\3zzz\etk\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32
Please use the argument -v to see more details.
可見似乎是 class 不存在的問題 已經好了,但新的問題是? 能否也指點一下迷津!謝謝!
他找不到 Str_random 這個 function啊,
你function放在哪裡?
如果是同一個檔案的話可以嘗試在前面加
$this-> 或 $this::
###str_random 不是 Laravel 封裝的全局函數嗎?
我沒有定義 Str_random 、tr_random 或 任何函數,難道是我還需要引入甚麼嗎?
另外:
我使用 $tmp['email'] = rand(100, 9999).'@gmail.com';
想要產生一些亂數的 email ,也好像有問題,因為生成的資料如下圖:
在" @gmail.com" 之前的數字,怎麼都一樣 rand(100000, 9999999)
不是會從100000~9999999之間亂數產生嗎?
加了$this:: 或是 $this->
<?php
use Illuminate\Database\Seeder;
class asSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
$arr = [];
for ($i=0; $i <20 ; $i++) {
# code...
$tmp = [];
$tmp['username'] = $this::str_random(10);
$tmp['password'] = $this::srand(0, 1);
$tmp['email'] = $this::rand(100, 9999).'@gmail.com';
$arr[] = $tmp;
}
DB::table('as')->insert($arr);
}
}
以後,變成報錯如下
Symfony\Component\Debug\Exception\FatalThrowableError : Call to undefined method asSeeder::str_random()
at C:\AppServ\www\3zzz\etk\database\seeds\asSeeder.php:19
15| $arr = [];
16| for ($i=0; $i <20 ; $i++) {
17| # code...
18| $tmp = [];
> 19| $tmp['username'] = $this::str_random(10);
20| $tmp['password'] = $this::srand(0, 1);
21| $tmp['email'] = $this::rand(100, 9999).'@gmail.com';
22| $arr[] = $tmp;
23| }
喔喔,
看到str_random了,
這個沒用過,
應該也是要引用什麼類,
這你要查一下,
那就不能用$this了.
另外你會重複應該是因為$tmp是同一個,
你嘗試看看直接用$i變數看寫入資料庫變怎麼樣?
新增陣列可以考慮array_push.
str_random 用得有問題的話 試試這個吧
https://laravel.com/docs/master/helpers#method-str-random
不過產生測試資料不是用 factory 更好嗎?
email 還會照格式幫你產生
此外,很多程式語言 class 名稱只接受大寫英文字母開頭,部分接受小寫,數字開頭幾乎沒見過
因為剛接觸 所以 factory 也還需要摸索一下, Seeder 先學會了有空再研究factory。
昨天經小魚大大提醒把表名去掉數字換成全英文後,找不到class 問題已經解決。
而剛剛我參考了f107110126提供的資料然後
將aaaSeeder中的 str_random 換成 str::random 如下:
再執行
composer dump-autoload
以及
php artisan db:seed --class=aaaSeeder
結果完全OK如下圖:
真棒!感謝兩位賜教,令人感覺處處有溫情,溫暖技術圈。謝謝啦!